我有一个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
置于其中,但是有更多正确的方法吗?
答案 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'))
请注意,您不能以这种方式使用复杂路径,只需从元素开始(包括该元素)查找具有特定标记名的所有元素。