2016-05-05 6 views
1

Ich versuche, eine XML-Datei zu analysieren, hängt von einem Tag ab, der vorhanden sein kann oder nicht!Parsing XML-Datei hängt von Tags ab, die möglicherweise nicht vorhanden sind

Wie kann ich diese IndexError vermeiden, ohne Ausnahme Handler zu verwenden?

Python-Skript:

#!/usr/bin/python3 
from xml.dom import minidom 


doc = minidom.parse("Data.xml") 

persons = doc.getElementsByTagName("person") 

for person in persons: 
    print(person.getElementsByTagName("phone")[0].firstChild.data) 

data.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<obo> 
    <Persons> 
     <person> 
      <id>XA123</id> 
      <first_name>Adam</first_name> 
      <last_name>John</last_name> 
      <phone>01-12322222</phone> 
     </person> 
     <person> 
      <id>XA7777</id> 
      <first_name>Anna</first_name> 
      <last_name>Watson</last_name> 
      <relationship> 
       <type>Friends</type> 
       <to>XA123</to> 
      </relationship> 
      <!--<phone>01-12322222</phone>--> 
     </person> 
    </Persons> 
</obo> 

und ich erhalte eine Indexerror:

01-12322222 
Traceback (most recent call last): 
    File "XML->Neo4j-try.py", line 29, in <module> 
    print(person.getElementsByTagName("phone")[0].firstChild.data) 
IndexError: list index out of range 
+1

Warum nicht Sie verwenden mögen Ausnahmehandler? Ich denke, es ist der gute Weg, das zu tun. Sie können If-else-Klauseln verwenden, um sicherzustellen, dass eine Ebene existiert. Aber dieser Weg ist nicht wirklich dynamisch. Sie können nicht wissen, wie viel Level es hat. – trantu

+0

cos Ich habe große XML-Datei, die - ich denke - lange braucht, um zu analysieren, wenn es viele Ausnahmen gibt Handler plz check [this] (http://stackoverflow.com/questions/37022525/loading-data-to-neo4j -von-xml-using-py2neo) – Zingo

Antwort

-1

es Fehler geben, weil, wenn eine Person nicht Telefon hat dann

from xml.dom import minidom 
doc = minidom.parse("Data.xml") 
persons = doc.getElementsByTagName("person") 
for person in persons: 
    if person.getElementsByTagName("phone"): 
     print(person.getElementsByTagName("phone")[0].firstChild.data) 
1

Zuerst müssen Sie prüfen, ob die aktuelle Person über Telefondaten verfügt, und nur dann fortfahren, wenn dies der Fall ist. Auch ist es etwas besser das Ergebnis getElementsByTagName() in einer Variablen zu speichern, die die gleiche Abfrage wiederholt zu vermeiden, besonders wenn die tatsächliche XML viel mehr Inhalt in jedem person Elemente:

for person in persons: 
    phones = person.getElementsByTagName("phone") 
    if phones: 
     print(phones[0].firstChild.data) 
Verwandte Themen