在 Python 2.6 中替代 ElementTree.iter()

Alternative to ElementTree.iter() in Python 2.6

我正在使用 ElementTree 解析 XML 个文件。

我使用的是 Python 3.6,但现在我必须将我的代码转移到只有 Python 2.6 的机器上。我对语法进行了一些必要的更改,但我仍然停留在 ET.iter(),它在 Python 2.6 中不存在,我使用它时没有参数来递归解析 ElementTree object.

我试图将 iter() 更改为 findall(),但这需要一个指定匹配项的参数来过滤元素。我也试过简单地做

for child in element:
    # ... etc.

...但是只有returns element下第一层的children,而不是它的所有后代(这是我需要的)。

如何递归获取 Python 2.6 中的所有元素?

ET.iter() was introduced in Python 2.7, to replace ET.getiterator() … which, although deprecated since then, remains available 直到并包括当前 Python 3.x 版本。

在许多情况下,如果需要 Python 2.6 兼容性,ET.getiterator() 可以用作 ET.iter() 的直接替代。

但是:需要注意的是,虽然它们在实践中经常可以互换,但这些方法不是 相同:ET.iter() returns 一个迭代器,而 ET.getiterator() returns 一个列表:

>>> tree.getiterator()
[<Element 'root' at 0x...>, <Element 'sub1' at 0x...>, <Element 'sub2' at 0x...>]
>>> tree.iter()
<_elementtree._element_iterator object at 0x...>

… 以及这种差异所暗示的对性能和功能的所有潜在影响。