Saltar al contenido

ElementTree – findall para seleccionar recursivamente todos los elementos secundarios

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *