2012-05-31 20 views

Respuesta

29

AFAIK ElementTree no es compatible con XPath. Ha cambiado?

De todos modos, puede utilizar lxml y la siguiente expresión XPath:

import lxml.etree 
doc = lxml.etree.parse('t.xml') 
print doc.xpath('//element[text()="A"]')[0].text 
print doc.xpath('//element[text()="A"]')[0].tag 

El resultado será:

A 
element 
9

Si desea utilizar la biblioteca estándar ElementTree, en lugar de lxml, se puede usar la iteración para encontrar todos los subelementos con un valor de texto particular. Por ejemplo:

import sys 
import xml.etree.ElementTree as etree 

s = """<root> 
    <element>A</element> 
    <element>B</element> 
</root>""" 

e = etree.fromstring(s) 

if sys.version_info < (2, 7): 
    found = [element for element in e.getiterator() if element.text == 'A'] 
else: 
    found = [element for element in e.iter() if element.text == 'A'] 

print found[0].text # This prints 'A', honestly! 

Nota: es posible que desee realizar alguna extracción del valor text de sus elementos en la lista por comprensión.

Editar Esto funcionará a cualquier profundidad en su árbol XML. Por ejemplo,

s = """<root> 
    <element>A</element> 
    <element><sub>A</sub></element> 
</root>""" 

found = [element for element in e.getiterator() if element.text == 'A'] 

for f in found: 
    print f 

imprimirá

<Element element at 7f20a882e3f8> 
<Element sub at 7f20a882e4d0> 
+1

He elegido usar cElementTree sobre lxml ya que para mi tarea tiene una sobrecarga de memoria mucho menor (la memoria es más crítica que el uso de la CPU), este fue el último código que necesité para pasar de lxml – Patrick

0

Puede utilizar XPath in ElementTree. No es necesario instalar ninguna lib.

config.findall('.//*[element="A"]/element') 

Como el comentario abajo desde @Bionicegenius explica, la expresión anterior solo funciona si el elemento no tiene hermanos, pero usted consigue la idea de utilizar XPath en el árbol de elementos.

+0

Esto tiene un problema de seleccionar todos los elementos en el mismo nivel que el nodo deseado. Encontrará ambos elementos con los valores A y B. Si lo modifica para buscar, solo encontrará el elemento con un valor de A, incluso si busca B, solo devolverá el primer hijo. – Bioniclegenius

Cuestiones relacionadas