繁体   English   中英

Python ElementTree:ElementTree与root元素

[英]Python ElementTree: ElementTree vs root Element

我对Python ElementTree API中的一些设计决策感到有些困惑 - 它们似乎有点武断,所以我想澄清一下这些决定是否有一些逻辑背后,或者它们是否只是更多或者不那么特别。

因此,通常有两种方法可能需要生成ElementTree - 一种是通过某种源流,如文件或其他I / O流。 这是通过parse()函数或ElementTree.parse()类方法实现的。

另一种方法是直接从字符串对象加载XML。 这可以通过fromstring()函数完成。

好,太棒了。 现在,我认为这些函数在它们返回的内容方面基本相同 - 它们之间的差异基本上是输入源(一个接受文件或流对象,另一个接受普通字符串。)除了某种原因, parse()函数返回一个ElementTree对象,但fromstring()函数返回一个Element对象。 区别在于Element对象是XML树的元素,而ElementTree对象是根元素周围的“包装器”,它提供了一些额外的功能。 您始终可以通过调用getroot()ElementTree对象获取根元素。

不过,我很困惑为什么我们有这种区别。 为什么fromstring()直接返回根元素,但是parse()返回一个ElementTree对象? 这种区别背后有一些逻辑吗?

这个古老的讨论得出了一个很好的答案:

仅供记录:Fredrik [ElementTree的创建者]实际上并不认为它是一个设计“怪癖”。 他认为它是针对不同的用例而设计的。 虽然parse()解析一个文件,该文件通常包含一个完整的文档(在ET中表示为ElementTree对象),但是来自fromstring(),特别是'literal wrapper'XML()用于解析字符串,其中(大多数?)通常只有包含XML片段。 使用片段,您通常希望继续执行将其插入另一个树的操作,因此几乎在所有情况下都需要顶级元素。

和:

为什么et.parse不是唯一的方法呢? 为什么要使用XML或fromstring?

用例。 XML()是fromstring()的别名,因为它的编写方便(并且读得很好)

section = XML('A to Z')section.append(paragraph)

用于源代码中的XML文字。 fromstring()就在那里,因为当你想从你从任何来源获得的字符串中解析一个片段时,很容易用这个函数来表达它,就像在

  el = fromstring(some_string) 

如果要从文件或类文件对象解析文档,请使用parse()。 三个用例,三个功能。 从字符串解析文档的第四个用例没有自己的函数,因为编写它是微不足道的

  tree = parse(BytesIO(some_byte_string)) 

我在评论中的思路与remram相同: parse采用文件位置或文件对象并保留该信息,以便它可以提供额外的实用程序,这非常有用。 如果解析没有返回ET对象,那么您必须更好地跟踪源和诸如此类的东西,以便手动将它们反馈到ET对象默认具有的辅助函数中。 与文件相比,字符串 - 按定义 - 没有从它们附加的相同类型的信息,因此您不能为它们创建相同的实用程序(否则很可能是ET.parsefromstring()方法将返回一个ET对象)。

我怀疑这也是被称为parse而不是ET.fromfile()的方法背后的逻辑:我希望从fromfilefromstring返回相同的对象类型,但不能说我希望从解析中得到相同的(它是自从我开始使用ET以来已经很长时间了,所以没有办法验证,但这是我的感觉)。

关于这个问题,Remram提出了在Elements上放置实用程序方法,据我所知文档,Elements在实现时非常均匀。 人们谈论“根元素”,但树的根部的元素在类属性和方法方面与所有其他元素完全相同。 据我所知,Elements甚至不知道他们的父母是谁,这可能会支持这种统一性。 否则,可能会有更多代码来实现“root”元素(没有父元素)或重新父元素。 在我看来,Element类的简单性对其有利。 所以对我来说似乎更好的做法是让Elements基本上不知道它们之上的任何东西(它们的父级,它们来自哪个文件),所以在同一个树(或类似的)中不能有任何关于4个不同输出文件的元素的障碍。

当谈到在代码中实现模块时,在我看来,脚本必须在某个时刻以某种方式将输入识别为文件(否则它会尝试将文件传递给fromstring )。 所以不应该出现这样的解析的输出应该是意外使得ElementTree的被认为是一个元素,作为这样的处理(当然,除非, 解析无需程序员检查,看看有什么解析做实施的情况下,这对我来说似乎是一个糟糕的习惯)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM