Solución:
A partir de la versión 2.7, puede utilizar xml.etree.ElementTree.Element.iter
:
import xml.etree.ElementTree as ET
root = ET.parse("h.xml")
print root.iter('saybye')
Ver 19.7. xml.etree.ElementTree – La API XML ElementTree
Si no le teme a un poco de XPath, puede utilizar el //
sintaxis que significa buscar cualquier nodo descendiente:
import xml.etree.ElementTree as ET
root = ET.parse("h.xml")
print root.findall('.//saybye')
No se admite XPath completo, pero aquí está la lista de lo que es: https://docs.python.org/2/library/xml.etree.elementtree.html#supported-xpath-syntax
Cotización findall
,
Element.findall()
encuentra solo elementos con una etiqueta que son hijos directos del elemento actual.
Dado que solo encuentra a los hijos directos, necesitamos buscar de forma recursiva a otros hijos, como este
>>> import xml.etree.ElementTree as ET
>>>
>>> def find_rec(node, element, result):
... for item in node.findall(element):
... result.append(item)
... find_rec(item, element, result)
... return result
...
>>> find_rec(ET.parse("h.xml"), 'saybye', [])
[<Element 'saybye' at 0x7f4fce206710>, <Element 'saybye' at 0x7f4fce206750>, <Element 'saybye' at 0x7f4fce2067d0>]
Aún mejor, conviértalo en una función de generador, así
>>> def find_rec(node, element):
... for item in node.findall(element):
... yield item
... for child in find_rec(item, element):
... yield child
...
>>> list(find_rec(ET.parse("h.xml"), 'saybye'))
[<Element 'saybye' at 0x7f4fce206a50>, <Element 'saybye' at 0x7f4fce206ad0>, <Element 'saybye' at 0x7f4fce206b10>]
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)