我正在尝试从字符串构建一个 ElementTree。当我执行以下操作时(如Python ElementTree:解析字符串并获取 ElementTree 实例中所述),我得到一个 Element 而不是 ElementTree:
companyTree = ElementTree.ElementTree(ElementTree.fromstring('<companies></companies>'))
如果我这样做
print(companyTree.getroot())
我明白了
AttributeError:'xml.etree.ElementTree.Element'对象没有属性'getroot'
换句话说,companyTree 是一个 Element 而不是 ElementTree。根据1中接受的答案,我应该得到一个ElementTree。 API 改变了吗?现在如何从字符串中获取 ElementTree?谢谢。
中有更多关于此问题的信息这个也咬了我。我有一些使用
parse()
的旧代码。我重构为使用fromstring()
,导致了同样的错误。
根据您的参考资料,我可以总结一下这里发生的事情;我相信这对于遇到这个特定错误的人来说是有益的。其他文章直接涉及 API 本身,因此我不会认为它们是重复的。
所以,首先要解决这一点。您是正确的,所述问题是相关的,但我不认为接受的答案是声称
fromstring()
应该返回 ElementTree
。相反,这个答案的作者是说在问题的上下文中字符串相当于一个完整的XML文档而不是一个片段,所以将其转换为ElementTree
是合适:
当您使用 ElementTree.fromstring() 时,您返回的基本上是树的根,因此,如果您创建像这样的 ElementTree.ElementTree(root) 的新树,您将得到您正在寻找的内容。
在他的代码示例中,他就是这么做的:
from xml.etree.ElementTree import fromstring, ElementTree
tree = ElementTree(fromstring(<your_xml_string>))
您发布的第二个参考文献证实了这种方法,该参考文献链接了该库作者的一篇旧文章,其中他指出(我解释道)这不是一个设计怪癖,而是一个功能。我们期望像
parse()
这样的结构设计用于处理完整文档,而 fromstring()
设计用于处理片段 和 文档。只是在后一种情况下,我们程序员必须解决歧义并通知库我们期望该字符串是一个完整的文档。
因此,就我的用例而言,我的 XML 字符串中有一个完整的文档,并且需要
ElementTree
功能,因此我将 fromstring()
调用包装在 ElementTree
中,如上面的示例所示。
对于 2023 年遇到此问题的任何人,从文档中,您可以执行以下操作:
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
其中
.parse()
返回 ElementTree,或者:
root = ET.fromstring(country_data_as_string)
直接返回根。所以不需要打电话
.getroot()
。