Эквивалент iter() ElementTree в Python2.6

У меня есть этот код с ElementTree, который хорошо работает с Python 2.7. Мне нужно было получить все узлы с именем «A» в узле «X/Y».

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(). Как я могу реализовать iter() с Python 2.6?


person prosseek    schedule 30.09.2011    source источник


Ответы (2)


Обратите внимание, что iter доступно в Python 2.6 (и даже 2.5 — в противном случае в docs), поэтому вам не нужна замена.

Однако вы можете использовать findall:

def _iter_python26(node):
  return [node] + node.findall('.//*')
person phihag    schedule 30.09.2011
comment
Это работает нормально, спасибо. Можно ли просто заменить iter на findall? По какой причине вводится iter(), когда у нас есть finadll()? - person prosseek; 01.10.2011
comment
@prosseek findall намного мощнее, чем iter, а также потенциально медленнее. Поэтому вы должны просто использовать iter, когда вам действительно нужны все узлы. Во многих случаях вам нужен только определенный набор узлов, например /group/product/price. Если это так, взгляните на документацию findall — это может сэкономить вам много кода Python. - person phihag; 01.10.2011
comment
Тогда что вызывает ошибку? У меня такая же проблема: root.iter работает в 2.7, выдает указанную выше ошибку в 2.6. findall исправил это. - person thumbtackthief; 30.05.2013
comment
У меня были такие же проблемы, как и у OP, когда я хотел получить простой текст элемента. Удалось собрать это вместе, поэтому я оставлю это здесь, если кому-то это понадобится. remove tags = lambda text: " ".join([i.text for i in xml.etree.ElementTree.fromstring(text).findall(".//*")]) - person kecer; 25.12.2014

Не уверен, что это то, что вы ищете, так как iter() кажется примерно в 2.6, но есть getiterator()

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

person Adam Wagner    schedule 30.09.2011
comment
Это то, что я искал. - person skjoshi; 05.06.2015
comment
Спасибо за информацию. Поэтому я должен явно переключиться на устаревший getiterator(), чтобы сохранить совместимость с Python 2.6. Это заставляет меня задуматься, почему они вообще отказались от старого имени функции? - person RayLuo; 02.02.2016