我正在尝试从字符串构建 ElementTree 。当我执行以下操作时(如Python ElementTree: Parsing a string and getting ElementTree instance中所述),我得到元素而不是 ElementTree :
companyTree = ElementTree.ElementTree(ElementTree.fromstring('<companies></companies>'))
如果我这样做
print(companyTree.getroot())
我得到了
AttributeError:'xml.etree.ElementTree.Element'对象没有属性'getroot'
换句话说,companyTree是元素而不是 ElementTree 。根据{{3}}中接受的答案,我应该得到一个ElementTree。 API有变化吗?我如何从字符串中获取ElementTree?感谢。
请注意,1
中有更多此问题答案 0 :(得分:12)
这也是我的一点。我有一些使用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>))
这种方法由您发布的second reference确认,该文章链接了图书馆作者的旧文章,其中他(并且我解释)说这不是一个设计怪癖,它是一个特征。我们期望像parse()
这样的结构可以处理完整的文档,而fromstring()
则可以处理片段和文档。正是在后一种情况下,我们程序员必须解决歧义并告知库我们期望该字符串是一个完整的文档。
所以,就我的用例而言,我的XML字符串中有一个完整的文档,并且需要ElementTree
个功能,因此我将fromstring()
调用包装在ElementTree
中在上面的例子中。