ElementTree返回元素而不是ElementTree

14

我正在尝试从一个字符串中构建一个ElementTree。当我按照以下步骤操作(如Python ElementTree: Parsing a string and getting ElementTree instance所述)时,我得到的是一个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?谢谢。

请注意,在Python ElementTree: ElementTree vs root Element有更多关于这个问题的内容。


1
“root” 和 “companyTree” 有什么关系? - lejlot
是的,那有点不清楚。companyTree = root(传递给一个带有root参数的方法)。已编辑。 - ElToro1966
1
我无法重现这个错误。执行 print(companyTree.getroot()) 会打印出 <Element 'companies' at 0x009B1630> - mzjn
你是完全正确的。传递给ElementTree的函数存在错误,导致了上述异常。谢谢。 - ElToro1966
2个回答

67
这个也把我咬了。我有一些旧代码,使用了parse()。我重构了代码,改用fromstring(),导致了同样的错误。根据您的参考资料,我可以总结出这里正在发生的事情;我认为这对于遇到这个具体错误的人们将是有益的。其他文章直接处理API本身,因此我不认为它们是重复的。
所以,首先解决this point这个问题。你说得对,陈述的问题是相关的,但我不认为被接受的答案声称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中。

3
非常有用的回答!不知道为什么没有其他的点赞。 - samwyse
1
{btsdaf} - Ajay Thomas
1
我会将您的回答视为被采纳的答案。我希望原帖作者也这样做。 - AKMalkadi

0
对于在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()

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