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()
函数对 ElementTree
和 Element
的工作方式相同,因为它是故意设计成这样的:
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
命名空间中有iterparse
和dump()
等辅助函数。 dump()
将完整的 xml 文档写入标准输出 [ref] 而iterparse
则迭代地吐出Element
s。对比parse()
,它返回一个xml.etree.ElementTree.ElementTree
对象,因此返回一个完整的层次结构,iterparse()
,它返回一个迭代器[1]。
1xml.etree.ElementTree
包命名空间和xml.etree.ElementTree.ElementTree
类名之间可能存在一些混淆。
【讨论】:
Element
和 ElementTree
对象都有一个 iter()
方法。你说“iter()
是一个简单的包装器”是什么意思?
我还是不明白。方法成为“简单包装器”意味着什么?
@mzjn 包装器通常是包装另一个函数的函数,主要是为了方便或呈现一致的界面。
iter()
包装了哪些其他方法/功能?这对理解 Element 和 ElementTree 对象之间的区别有何帮助?以上是关于ElementTree 和 Element 有啥区别? (蟒蛇xml)的主要内容,如果未能解决你的问题,请参考以下文章
Java 中 给一个object 赋值属性, 既可以用构造函数的方式,也可以用setXXXX()的方式,而它们之间有啥区
python-23 xml.etree.ElementTree模块