【问题标题】:Behavior of ElementTree iteratorElementTree 迭代器的行为
【发布时间】:2014-02-11 18:43:22
【问题描述】:

我最初对 Element.__iter()__ElementTree.__iter__() 的行为感到困惑。我不清楚迭代器是否对它下面的 all 元素进行完整的深度优先遍历,或者它是否只迭代直接子元素。

以下测试表明它迭代直接子代:

>>> import xml.etree.ElementTree as etree
>>> s = "<root><foo><bar></bar></foo><baz></baz></root>"
>>> t = etree.fromstring(s)
>>> for e in t: print(e)
... 
<Element 'foo' at 0x7ff15646a650>
<Element 'baz' at 0x7ff15646a6d0>

请注意,&lt;bar&gt; 不包括在内,因为&lt;bar&gt;&lt;foo&gt; 的子代,而不是&lt;root&gt;

好吧,好吧……有道理。

但是 Python docs 说:

iter(tag=None)

创建一个以当前元素为根的树迭代器。这 迭代器迭代这个元素和它下面的所有元素,在 文档(深度优先)顺序。如果标签不是无或'*',只有元素 从迭代器返回其标签等于标签。如果树 结构在迭代过程中被修改,结果未定义。

这个措辞,尤其是短语“以文档(深度优先)顺序迭代这个元素及其下面的所有元素”,强烈地,强烈地向我暗示文档说迭代器应该迭代子树中的 ALL 元素,而不仅仅是直接子元素。

另外,文档还说“创建一个以 当前元素为根的树迭代器。迭代器迭代 这个元素和它下面的所有元素” - 表示根元素应该是迭代中返回的第一个元素。但实际上并没有返回根元素。而是返回第一个孩子。

所以,这个文档似乎非常具有误导性……让我很困惑。是这里的文档完全错误,还是我没有正确解释它所说的内容?

【问题讨论】:

  • 您链接到 Element 类的文档,而不是 ElementTree。 The docs for ElementTree 说“迭代器循环遍历这棵树中的所有元素”,这有点模棱两可。

标签: python python-3.x elementtree


【解决方案1】:

您在文档中引用的 iter__iter__ 方法不同。

要以深度优先顺序遍历所有标签,请使用iter 方法,如下所示:

>>> for e in t.iter(): print(e)
... 
<Element 'root' at 0x10b92ccd0>
<Element 'foo' at 0x10b92cd10>
<Element 'bar' at 0x10b92cd50>
<Element 'baz' at 0x10b92ce10>

相比之下,__iter__ 只会迭代直接子代。

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多