2016-07-27 2 views
2

Я пытаюсь выполнить синтаксический анализ XML и получить данные для file_name и file_path, но при запуске ниже ошибки может кто-нибудь помочь выяснить, почему и как его решить?Ошибка во время разбора XML

ВХОДА XML: -

<?xml version="1.0" ?> 
    <contents> 
    <build> 
     <name>modem</name> 
     <role>modem</role> 
     <chipset>mms1234</chipset> 
    </build> 
    <build> 
     <name>boot</name> 
     <role>boot</role> 
     <chipset>ms1234</chipset> 
     <device_programmer minimized="true"> 
     <file_name>prog_emmc_house_4567_ddr.elf</file_name> 
     <file_path>images/comPkg/Msm4567Pkg/Bin64/</file_path> 
     </device_programmer> 
     <flash_programmer minimized="true"> 
     </flash_programmer> 
    </build> 
    </contents> 

КОД: -

contents_xml_file = r"device_programmer.xml" 
print contents_xml_file 
tree = ET.parse(contents_xml_file) 
root = tree.getroot() 
device_programmer = root.find("device_programmer") 

file_name = device_programmer.get('file_name') 
print file_name 
file_path = device_programmer.get('file_path') 
print file_path 

ОШИБКА: -

Traceback (most recent call last): 
    File "script.py", line 37, in <module> 
    file_name = device_programmer.get('file_name') 
AttributeError: 'NoneType' object has no attribute 'get' 

ответ

1

Из документации:

Element.findall() finds only elements with a tag which are direct children of the current element. Element.find() finds the first child with a particular tag, and Element.text accesses the element’s text content. Element.get() accesses the element’s attributes:

Вот почему

device_programmer = root.find("device_programmer") 

возвращается None, поскольку нет device_programmer элемента непосредственно под root.

Вы, вероятно, следует использовать синтаксис XPath:

device_programmer = root.find("//device_programmer") 
+0

что '[2]' в сборке [2] –

+0

Второй 'build' тег под корень. –

+0

выше xml - это просто пример, он не должен быть во 2-й позиции, он может быть где угодно в xml, требуется более общее решение. –

0

Поскольку device_programmer не является прямым потомком корневого элемента, вам нужно добавить .// в начале. . указывает на то, что в XPath является относительно контекстного элемента (корневого элемента в данном случае), и // сокращенно синтаксис для descendant-or-self оси:

device_programmer = root.find(".//device_programmer") 

Вместо атрибутов, file_name и file_path являются прямым потомком device_programmer, так что вам нужно использовать find('element_name'), чтобы получить их:

file_name = device_programmer.find('file_name') 
print file_name.text 
file_path = device_programmer.find('file_path') 
print file_path.text 
Смежные вопросы