我正在尝试从字符串构建一个ElementTree。当我执行以下操作时(如Python ElementTree:解析字符串并获取ElementTree实例中所示),我将得到一个元素而不是一个ElementTree
companyTree = ElementTree.ElementTree(ElementTree.fromstring('<companies></companies>'))
如果我做了
print(companyTree.getroot())
我得到了
AttributeError:“xml.etree.ElementTree.Element”对象没有属性“getroot”
换句话说,companyTree是一个元素,而不是ElementTree。根据1中公认的答案,我应该得到一个ElementTree。API改变了吗?现在如何从字符串中获得ElementTree?谢谢。
请注意,在Python ElementTree: ElementTree与根元素中有更多关于这个问题的内容。
发布于 2017-06-11 11:21:54
这只也咬了我。我有一些使用parse()
的旧代码。我重构为使用fromstring()
,导致了同样的错误。根据您的参考资料,我可以总结这里发生的事情;我相信这将有利于人们得到这个特定的错误。其他文章直接处理API本身,因此我不认为它们是重复的。
所以,首先要解决这一点问题。您说的问题是相关的,这是正确的,但是我不认为公认的答案是声称fromstring()
应该返回一个ElementTree
。相反,这个答案的作者说,在问题的上下文中,字符串等价于一个完整的XML文档,而不是一个片段,因此将其转换为ElementTree
是合适的
当您使用ElementTree.fromstring()时,您要返回的基本上是树的根,所以如果您创建了一个像这个ElementTree.ElementTree(根)这样的新树,那么您将得到您想要的。
在他的代码样本中,他就是这样做的:
from xml.etree.ElementTree import fromstring, ElementTree
tree = ElementTree(fromstring(<your_xml_string>))
这种方法被您发布的二次参考所证实,它链接了库的作者的一篇旧文章,他在文章中声明(我是这么说的),这不是一个设计怪癖,而是一个特性。我们的期望是,像parse()
这样的构造是为处理完整的文档而设计的,而fromstring()
则是设计用来处理片段和文档的。在后一种情况下,我们程序员必须解决歧义,并通知库,我们希望字符串是一个完整的文档。
因此,就我的用例而言,我的XML中有一个完整的文档,并且需要ElementTree
特性,所以我将fromstring()
调用封装在一个ElementTree
中,如上面的示例所示。
https://stackoverflow.com/questions/33962620
复制相似问题