ElementTree findall ‘o’ operator

Si tengo un archivo xml como este:

  something   something   something   

Puedo usar xmlTree.getroot().findall("item") para obtener todos los elementos ‘item’.

¿Cómo obtendría todos los elementos del ‘elemento’ O ‘prueba’? Quiero algo como:

xmlTree.getroot().findall("item or test")

No vi nada como esto en los ejemplos de la documentación. ¿Algunas ideas?

Dado que ElementTree de stdlib solo proporciona soporte limitado para xpath , puede usar | operador xpath O solo si está utilizando lxml :

 from lxml import etree as ET data = """  1 2 """ tree = ET.fromstring(data) for element in tree.xpath('//item|//test'): print element.text 

huellas dactilares:

 1 2 

En el caso de xml.etree.ElementTree puede combinar los resultados de dos llamadas findall() separadas:

 for element in tree.findall('.//item') + tree.findall('.//test'): print element.text 

O, compruebe el nombre de la etiqueta dentro del bucle:

 for element in tree.iter(): if element.tag in ('item', 'test'): print element.text 

Una solución de “comodín” para grandes conjuntos de datos

Aquí hay una solución donde no necesita especificar “A | B | …”. En su lugar, use “*” como comodín y filtre las partes no deseadas por el índice como se muestra a continuación en el código (por ejemplo, en esta pregunta, la última etiqueta “test2” se puede excluir usando lst [: – 1]).

 import xml.etree.ElementTree as ET data='''   something1   something2   something3  ''' root = ET.fromstring(data) lst = root.findall('*') for x in lst[:-1]: print(x.find('prop').text) 

SALIDA:

algo1

algo2