Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ElementTree:ElementTree与根元素_Python - Fatal编程技术网

Python ElementTree:ElementTree与根元素

Python ElementTree:ElementTree与根元素,python,Python,我对PythonElementTreeAPI中的一些设计决策有点困惑——它们似乎是任意的,所以我想澄清一下,看看这些决策背后是否有一些逻辑,或者它们是否或多或少是临时的 因此,通常有两种方法可以生成ElementTree——一种是通过某种源流,如文件或其他I/O流。这是通过parse()函数或ElementTree.parse()类方法实现的 另一种方法是直接从字符串对象加载XML。这可以通过fromstring()函数完成 好的,很好。现在,我认为这些函数在返回内容方面基本上是相同的-它们之间

我对PythonElementTreeAPI中的一些设计决策有点困惑——它们似乎是任意的,所以我想澄清一下,看看这些决策背后是否有一些逻辑,或者它们是否或多或少是临时的

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

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

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


不过,我还是不明白为什么我们会有这种区别。为什么
fromstring()
直接返回根元素,而
parse()
返回
ElementTree
对象?这种区别背后有什么逻辑吗?

我的想法与评论中的remram相同:parse获取一个文件位置或一个文件对象,并保留该信息,以便提供额外的实用程序,这非常有用。如果parse没有返回ET对象,那么您必须更好地跟踪源等等,以便手动将它们反馈到ET对象默认拥有的helper函数中。与文件不同的是,根据定义,字符串没有从中附加相同类型的信息,因此您不能为它们创建相同的实用程序(否则很可能会有一个ET.parsefromstring()方法返回一个ET对象)

我怀疑这也是名为parse而不是ET.fromfile()的方法背后的逻辑:我期望从fromfile和fromstring返回相同的对象类型,但不能说我期望从parse返回相同的对象类型(自从我开始使用ET以来已经有很长时间了,所以没有办法验证这一点,但这是我的感觉)

关于Remram提出的在元素上放置实用方法的问题,据我所知,在文档中,元素在实现时是非常统一的。人们谈论“根元素”,但树的根元素在其类属性和方法方面与所有其他元素完全相同。据我所知,元素甚至不知道他们的父母是谁,这很可能支持这种一致性。否则,可能会有更多代码来实现“root”元素(它没有父元素)或重新设置子元素的父元素。在我看来,元素类的简单性非常有利于它。因此,在我看来,最好让元素基本上不知道它们上面的任何东西(它们的父元素,它们来自的文件),这样就不会有关于同一棵树(或类似树)中具有不同输出文件的4个元素的任何障碍


当涉及到在代码内部实现模块时,在我看来,脚本必须以某种方式将输入识别为文件(否则它将尝试将文件传递给fromstring)。因此,不应该出现这样一种情况,即解析的输出应该是意外的,以至于ElementTree被假定为一个元素并被如此处理(当然,除非解析是在程序员没有检查解析做了什么的情况下实现的,这对我来说似乎是一个坏习惯).

一个美丽的答案来自这句老话:

只是为了记录:Fredrik(EntErthRead的创建者)实际上并不认为它是一种设计。 “怪癖”。他认为它是为不同的用例设计的。虽然 parse()解析通常包含完整文档的文件 (在ET中表示为ElementTree对象)、fromstring()和 特别是'literal wrapper'XML()用于解析字符串, 其中(大多数?)通常只包含XML片段。带着碎片,你 通常,你想继续做一些事情,比如把它插入另一个 树,因此几乎在所有情况下都需要顶级元素

以及:

为什么et.parse不是实现这一点的唯一方法?为什么要使用XML或fromstring 到底是什么

嗯,用例。XML()是fromstring()的别名,因为它是 书写方便(且可读性好)

section=XML('A到Z') 第节.附加(段落)

用于源代码中的XML文本。fromstring()存在是因为 你想从一个字符串中解析一个片段,这个字符串是从任何 源代码,用这个函数很容易表达,如

    el = fromstring(some_string)
如果要从文件或类似文件的对象解析文档,请使用 parse()。三个用例,三个功能。的第四个用例 从字符串解析文档没有自己的功能, 因为写起来很琐碎

    tree = parse(BytesIO(some_byte_string))

老实说,
ElementTree
API有时有一些非常奇怪的决定,这就是其中之一。我使用lxml,API也是一样的。我也想知道这些问题的答案。我倾向于将内容保持在包装器级别,但我不知道为什么.ElementTree比Element有更多的功能,尤其是
write()
。我并不是说不能为元素提供这些,但它们是主要的区别<有限公司