Python XML вопрос - PullRequest
       18

Python XML вопрос

0 голосов
/ 13 сентября 2011

У меня есть XML-документ как str. Теперь в XSD <foo> не ограничено, и хотя большую часть времени существует только 1, МОЖЕТ быть больше. Я пытаюсь использовать ElementTree, но сталкиваюсь с проблемой:

>>> from xml.etree.ElementTree import fromstring
>>> 
>>> xml_str = """<?xml version="1.0"?>
... <foo>
...     <bar>
...         <baz>Spam</baz>
...         <qux>Eggs</qux>
...     </bar>
... </foo>"""
>>> # Try to get the document
>>> el = fromstring(xml_str)
>>> el.findall('foo')
[]
>>> el.findall('bar')
[<Element 'bar' at 0x1004acb90>]

Ясно, что мне нужно перебрать <foo> s, но, поскольку <foo> находится в корне, я не могу. Очевидно, я мог бы создать элемент с именем <root> и поместить в него el, но есть ли более правильный способ сделать это?

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Каждый XML-документ должен иметь ровно один корневой элемент .Вам нужно будет настроить свой XML, если вы хотите поддерживать несколько foo элементов.

2 голосов
/ 13 сентября 2011

Увы, завершение элемента в ElementTree с помощью tree = ElementTree(el) и попытка tree.findall('//foo'), похоже, тоже не работают (кажется, вы можете искать только «под» элементом, и даже если поиск выполняется из полное дерево, оно ищет "под" корнем). Поскольку ElementTree не претендует на то, чтобы действительно реализовать xpath, трудно сказать, является ли это намерением или ошибкой.

Решение: без использования lxml с полной поддержкой xpath (например, el.xpath('//foo')) самым простым решением было бы использование метода Element.iter () .

for foo in el.iter(tag='foo'):
    print foo

или, если вы хотите, чтобы результаты в списке:

list(el.iter(tag='foo'))

Обратите внимание, что вы не можете использовать сложные пути таким образом, просто найдите все элементы с определенным тэгом, начиная с (и включая) элемент.

...