2011-09-30 28 views
12

Tengo este código con ElementTree que funciona bien con Python 2.7. Necesitaba obtener todos los nodos con el nombre "A" en el nodo "X/Y".Iter() de ElementTree equivalente en Python2.6

from xml.etree.ElementTree import ElementTree 

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

Sin embargo, cuando traté de ejecutarlo con Python 2.6, obtuve este error.

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

Parece que Python 2.6 nodo de elementtree no tiene el iter(). ¿Cómo puedo implementar el iter() con Python 2.6?

Respuesta

8

Tenga en cuenta que es iter disponibles en Python 2.6 (2.5 e incluso - de lo contrario, no habría un aviso en el docs), por lo que realmente no necesita un reemplazo.

Puede, sin embargo, utiliza findall:

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

Funciona bien, gracias. ¿Está bien, simplemente reemplace iter con findall? ¿Cuál sería la razón por la cual se introduce iter() cuando tenemos finadll()? – prosseek

+0

@prosseek 'findall' es mucho más poderoso que' iter', y también potencialmente más lento. Por lo tanto, solo debe usar 'iter' cuando realmente desee todos los nodos. En muchos casos, solo desea un determinado conjunto de nodos, como '/ group/product/price'. Si ese es el caso, eche un vistazo a la documentación de 'findall' - podría ahorrarle mucho código de Python. – phihag

+1

Entonces, ¿qué causa el error? Tengo el mismo problema: root.iter funciona en 2.7, provoca el error anterior en 2.6. Findall lo arregló. – thumbtackthief

15

No estoy seguro si esto es lo que busca, como iter() parece ser alrededor de 2,6, pero hay getiterator()

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

+0

Eso es lo que era buscando. – skjoshi

+0

Gracias por la información. Así que tengo que cambiar explícitamente al getiterator en desuso() para mantener la compatibilidad con Python 2.6. Me hace pensar "entonces ¿por qué desaprobaron el antiguo nombre de la función en primer lugar?". – RayLuo

Cuestiones relacionadas