Python ElementTree:解析字符串并获得ElementTree实例

22

我有一个包含XML数据的字符串,它是从http请求返回的。

我正在使用ElementTree来解析数据,然后我想递归地搜索元素。

根据这个问题,如果result是类型为Element而不是ElementTree,则只能使用result.findall()递归搜索。

现在,用于解析字符串的xml.etree.ElementTree.fromstring()返回一个Element对象,而用于解析文件xml.etree.ElementTree.parse()返回一个ElementTree对象。

因此,我的问题是:如何解析字符串并获得ElementTree实例?(不需要像写入临时文件之类的疯狂的方法)

2个回答

32

使用ElementTree.fromstring()方法,你得到的基本上就是整个树的根节点,因此如果你创建一个新的树并将其作为根节点传入ElementTree.ElementTree(root),你就会得到想要的结果。

简单说,就是从字符串中解析XML文档得到的是整个树的根节点,需要将其传递给ElementTree.ElementTree()方法来获得完整的树结构。

from xml.etree import ElementTree
tree = ElementTree.ElementTree(ElementTree.fromstring(<your_xml_string>))
或:
from xml.etree.ElementTree import fromstring, ElementTree
tree = ElementTree(fromstring(<your_xml_string>))

我只想补充一点 - 对于那些使用lxml的人来说 - 在lxml中(其中一个元素始终属于文档/树,即使是隐式的),您可以使用getrootttree()方法。 - Steven
1
谢谢!etree中的API设计真让人烦恼,它根据输入源的不同而产生不同类型的输出。真的很令人困惑:( - Samuel Lampa
1
这在文档中并不是非常清晰。"fromstring()函数可以直接将XML字符串解析为一个元素(Element),该元素是解析树的根元素。其他解析函数可能会创建一个ElementTree。" - Snorfalorpagus

8

将您的字符串转换为类似文件的对象,然后使用 ElementTree.parse

from xml.etree import ElementTree
from cStringIO import StringIO

tree = ElementTree.parse(StringIO(string))

1
太好了,这就是我在寻找的那一个。 :-) - Rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接