¿Cómo iterar recursivamente sobre las tags XML en Python usando ElementTree?

Estoy intentando iterar sobre todos los nodos en un árbol usando ElementTree.

Hago algo como

tree = ET.parse("/tmp/test.xml") root = tree.getroot() for child in root: ### do something with child 

El problema es que el elemento secundario es un objeto Element y no un objeto ElementTree, por lo que no puedo seguir investigándolo y repetir para iterar sobre sus elementos. ¿Hay una manera de iterar de manera diferente sobre “root” para que itere sobre los nodos de nivel superior en el árbol (hijos inmediatos) y devuelva la misma clase que root?

Para iterar sobre todos los nodos, use el método iter en ElementTree , no el elemento raíz.

La raíz es un elemento, al igual que los otros elementos en el árbol y solo tiene realmente el contexto de sus propios atributos e hijos. El ElementTree tiene el contexto para todos los elementos.

Por ejemplo, dado este xml

    1 2008 141100     4 2011 59900    68 2011 13600     

Puedes hacer lo siguiente

 >>> import xml.etree.ElementTree as ET >>> tree = ET.parse('test.xml') >>> for elem in tree.iter(): ... print elem ...                   

Agregando a la respuesta de Robert Christie, es posible iterar sobre todos los nodos utilizando fromstring() al convertir el Elemento en un ElementTree:

 import xml.etree.ElementTree as ET e = ET.ElementTree(ET.fromstring(xml_string)) for elt in e.iter(): print "%s: '%s'" % (elt.tag, elt.text) 

También puedes acceder a elementos específicos como este:

 country= tree.findall('.//country') 

luego bucle sobre el range(len(country)) y acceso

Además de la respuesta aceptada de Robert Christie, imprimir los valores y las tags por separado es muy fácil:

 tree = ET.parse('test.xml') for elem in tree.iter(): print(elem.tag, elem.text)