Python XML 问题

0 投票
2 回答
1226 浏览
提问于 2025-04-17 02:09

我有一个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进行一些调整。

撰写回答