2011-09-30 7 views
12

Ho questo codice con ElementTree che funziona bene con Python 2.7. Avevo bisogno di ottenere tutti i nodi con il nome "A" sotto il nodo "X/Y".L'equivalente di iter() di ElementTree in Python2.6

from xml.etree.ElementTree import ElementTree 

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

Tuttavia, quando ho provato a eseguirlo con Python 2.6, ho ricevuto questo errore.

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

Sembra che il nodo di Python 2.6 ElementTree non abbia l'iter(). Come posso implementare iter() con Python 2.6?

risposta

8

noti che iterè disponibile in Python 2.6 (e anche 2.5 - in caso contrario, non ci sarebbe un avviso nella docs), in modo che non si ha realmente bisogno di una sostituzione.

È possibile, tuttavia, utilizzare findall:

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

Funziona bene, grazie. Va bene, basta sostituire iter con findall? Quale sarebbe la ragione per cui iter() viene introdotto quando abbiamo finadll()? – prosseek

+0

@prosseek 'findall' è molto più potente di' iter', e anche potenzialmente più lento. Pertanto, dovresti semplicemente usare 'iter' quando vuoi veramente tutti i nodi. In molti casi, vuoi solo un certo insieme di nodi, come '/ group/product/price'. Se è così, dai un'occhiata alla documentazione di 'findall' - potrebbe farti risparmiare un sacco di codice Python. – phihag

+1

Quindi cosa causa l'errore? Ho lo stesso problema: root.iter funziona in 2.7, solleva l'errore sopra riportato in 2.6. findall l'ha riparato. – thumbtackthief

15

Non sono sicuro se questo è quello che stai cercando, come iter() sembra essere intorno a 2,6, ma c'è getiterator()

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

+0

Questo è quello che ero cercando. – skjoshi

+0

Grazie per le informazioni. Quindi devo passare esplicitamente al deprecato getiterator() per mantenere la compatibilità con Python 2.6. Mi fa pensare "allora perché hanno deprecato il vecchio nome della funzione in primo luogo?". – RayLuo