【发布时间】: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>
请注意,<bar> 不包括在内,因为<bar> 是<foo> 的子代,而不是<root>。
好吧,好吧……有道理。
但是 Python docs 说:
iter(tag=None)
创建一个以当前元素为根的树迭代器。这 迭代器迭代这个元素和它下面的所有元素,在 文档(深度优先)顺序。如果标签不是无或'*',只有元素 从迭代器返回其标签等于标签。如果树 结构在迭代过程中被修改,结果未定义。
这个措辞,尤其是短语“以文档(深度优先)顺序迭代这个元素及其下面的所有元素”,强烈地,强烈地向我暗示文档说迭代器应该迭代子树中的 ALL 元素,而不仅仅是直接子元素。
另外,文档还说“创建一个以 当前元素为根的树迭代器。迭代器迭代 这个元素和它下面的所有元素” - 表示根元素应该是迭代中返回的第一个元素。但实际上并没有返回根元素。而是返回第一个孩子。
所以,这个文档似乎非常具有误导性……让我很困惑。是这里的文档完全错误,还是我没有正确解释它所说的内容?
【问题讨论】:
-
您链接到 Element 类的文档,而不是 ElementTree。 The docs for ElementTree 说“迭代器循环遍历这棵树中的所有元素”,这有点模棱两可。
标签: python python-3.x elementtree