Python XML 问题
我有一个XML文档,它是一个字符串。现在,在XSD中,<foo>
是没有限制的,虽然大多数情况下只有一个,但也可能会有多个。我正在尝试使用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 个回答
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'))
注意,这种方式不能使用复杂的路径,只能找到某个标签名的所有元素,从这个元素开始(包括这个元素)。
3
每个XML文档应该只有一个根元素。也就是说,如果你想在你的XML中有多个foo
元素,你需要对你的XML进行一些调整。