Python XML问题

时间:2011-09-13 01:00:54

标签: python xml xml-parsing elementtree

我有一个XML文档作为str。现在,在XSD中<foo>是无界的,虽然大部分时间只有1,但 COULD 更多。我正在尝试使用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>,但由于<foo>位于根,我不能。显然,我可以创建一个名为<root>的元素并将el置于其中,但是有更多正确的方法吗?

2 个答案:

答案 0 :(得分:3)

每个XML文档应该只有一个root element。如果要支持多个foo元素,则需要调整XML。

答案 1 :(得分:2)

唉,将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'))

请注意,您不能以这种方式使用复杂路径,只需从元素开始(包括该元素)查找具有特定标记名的所有元素。