【问题标题】:ElementTree's iter() equivalent in Python2.6Python2.6 中 ElementTree 的 iter() 等价物
【发布时间】:2011-11-28 19:54:48
【问题描述】:

我的 ElementTree 代码在 Python 2.7 中运行良好。 我需要在“X/Y”节点下获取所有名为“A”的节点。

from xml.etree.ElementTree import ElementTree

verboseNode = topNode.find("X/Y")
nodes = list(verboseNode.iter("A"))

但是,当我尝试使用 Python 2.6 运行它时,我收到了这个错误。

ionCalculateSkewConstraint.py", line 303, in getNodesWithAttribute
    nodes = list(startNode.iter(nodeName))
AttributeError: _ElementInterface instance has no attribute 'iter'

看起来 Python 2.6 ElementTree 的节点没有 iter()。 如何使用 Python 2.6 实现 iter()?

【问题讨论】:

    标签: python xml python-2.6 elementtree


    【解决方案1】:

    请注意,iter 在 Python 2.6(甚至 2.5 - 否则,docs 中会有通知)中可用,因此您实际上不需要替换。

    不过,您可以使用findall

    def _iter_python26(node):
      return [node] + node.findall('.//*')
    

    【讨论】:

    • 它工作正常,谢谢。用 findall 替换 iter 可以吗?当我们有 finadll() 时引入 iter() 的原因是什么?
    • @prosseek findalliter 强大得多,但也可能更慢。因此,当你真的想要所有节点时,你应该只使用iter。在许多情况下,您只需要一组特定的节点,例如/group/product/price。如果是这种情况,请查看 findall 的文档 - 它可能会为您节省大量 Python 代码。
    • 那是什么原因导致的错误呢?我有同样的问题:root.iter 在 2.7 中工作,在 2.6 中引发上述错误。 findall 修复了它。
    • 我在 python 2.6 中看不到任何 iter() docs.python.org/2.6/library/…
    • 当我想获取元素的纯文本时,我遇到了与 OP 类似的问题。设法把它放在一起,所以我会把它留在这里以防有人需要它。 remove tags = lambda text: " ".join([i.text for i in xml.etree.ElementTree.fromstring(text).findall(".//*")])
    【解决方案2】:

    不确定这是否是您要查找的内容,因为 iter() 似乎在 2.6 中,但有 getiterator()

    http://docs.python.org/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.getiterator

    【讨论】:

    • 这就是我要找的。​​span>
    • 感谢您的信息。因此,我必须显式切换到已弃用的 getiterator() 以保持 Python 2.6 兼容性。这有点让我想“那他们为什么一开始就弃用旧的函数名呢?”。
    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多