ElementTree 和 Element 有啥区别? (蟒蛇xml)

Posted

技术标签:

【中文标题】ElementTree 和 Element 有啥区别? (蟒蛇xml)【英文标题】:What is the difference between a ElementTree and an Element? (python xml)ElementTree 和 Element 有什么区别? (蟒蛇xml) 【发布时间】:2015-06-12 22:38:20 【问题描述】:
from xml.etree.ElementTree import ElementTree, Element, SubElement, dump

elem = Element('1')
sub = SubElement(elem, '2')
tree = ElementTree(elem)

dump(tree)
dump(elem)

在上面的代码中,转储树(它是一个元素树)和转储 elem(它是一个元素)会产生相同的结果。因此,我无法确定两者之间的区别。

【问题讨论】:

【参考方案1】:

转储树(它是一个元素树)和转储 elem(它是一个元素)会导致同样的事情。

dump() 函数对 ElementTreeElement 的工作方式相同,因为它是故意设计成这样的:

def dump(elem):
    # debugging
    if not isinstance(elem, ElementTree):
        elem = ElementTree(elem)
    elem.write(sys.stdout)
    ...

我无法确定两者之间的区别。

ElementTree 是一个包装类,对应于提供序列化功能的“整个元素层次结构”——转储和加载树。另一方面,Element 是一个“更大”的类,它定义了 Element 接口。

【讨论】:

你能想出一个很好的方式来说明两者的区别吗?【参考方案2】:

ElementTree 包装类用于读取和写入 XML 文件 [ref]。大多数ElementTree api 是根Element [ref] 周围的简单包装器。简单地说,ElementTree 包装了根 Element(为了方便)并提供了序列化/反序列化整个树的方法。因此parse() 属于ElementTree,其中iter() 是一个简单的包装器。

然后在xml.etree.ElementTree 命名空间中有iterparsedump() 等辅助函数。 dump() 将完整的 xml 文档写入标准输出 [ref] 而iterparse 则迭代地吐出Elements。对比parse(),它返回一个xml.etree.ElementTree.ElementTree 对象,因此返回一个完整的层次结构,iterparse(),它返回一个迭代器[1]。

1xml.etree.ElementTree 包命名空间和xml.etree.ElementTree.ElementTree 类名之间可能存在一些混淆。

【讨论】:

ElementElementTree 对象都有一个 iter() 方法。你说“iter() 是一个简单的包装器”是什么意思? 我还是不明白。方法成为“简单包装器”意味着什么? @mzjn 包装器通常是包装另一个函数的函数,主要是为了方便或呈现一致的界面。 iter() 包装了哪些其他方法/功能?这对理解 Element 和 ElementTree 对象之间的区别有何帮助?

以上是关于ElementTree 和 Element 有啥区别? (蟒蛇xml)的主要内容,如果未能解决你的问题,请参考以下文章

Java 中 给一个object 赋值属性, 既可以用构造函数的方式,也可以用setXXXX()的方式,而它们之间有啥区

python XML ElementTree的增删改查

ElementTree之Xml文档处理

python-23 xml.etree.ElementTree模块

Python不归路_xml.etree.ElementTree模块

python的XML处理模块ElementTree