2016-05-05 2 views
1

Я пытаюсь разобрать XML-файл, зависит от тега, который может быть или не существовать!Анализ XML-файла зависит от тегов, которые могут быть или не быть.

Как я могу избежать этого IndexError без использования обработчика исключений?

питон скрипт:

#!/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> 

и я получаю 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

Почему вы не хотите использовать обработчик исключений? Я думаю, что это хороший способ сделать это. Вы можете использовать аргументы if-else, чтобы убедиться, существует ли уровень. Но этот способ не является действительно динамичным. Возможно, вы не знаете, сколько у него уровня. – trantu

+0

cos У меня есть большой файл xml, который, я думаю, займет много времени, чтобы проанализировать, если есть много обработчиков исключений. Plz check [this] (http://stackoverflow.com/questions/37022525/loading-data-to-neo4j -из-XML-с помощью-py2neo) – Zingo

ответ

-1

он дает ошибку, потому что если человек не имеет телефон затем

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

Во-первых, вам нужно проверить, имеются ли у текущего человека данные о телефоне, и продолжить дальше, только если он есть. Кроме того, это немного лучше сохранить результат getElementsByTagName() в переменной, чтобы не делать такой же запрос несколько раз, особенно когда фактический XML имеет гораздо больше содержания в каждом person элемента:

for person in persons: 
    phones = person.getElementsByTagName("phone") 
    if phones: 
     print(phones[0].firstChild.data) 
Смежные вопросы