2011-11-20 27 views
7

Estoy trabajando con algunos datos XML que, en algunas ubicaciones de cada archivo, redefinen el espacio de nombres. Estoy tratando de extraer todas las etiquetas de un tipo específico del documento, independientemente del espacio de nombres que esté activo en el punto donde reside la etiqueta en el XML.Parse XML con Python Etree y etiqueta devuelta especificada independientemente del espacio de nombres

Estoy usando findall('.//{namespace}Tag') para encontrar los elementos que estoy buscando. Pero nunca saber qué será el {namespace} en un punto dado del archivo, hace que pase desapercibido si obtengo o no todas las etiquetas solicitadas.

¿Hay alguna manera de devolver todos los elementos de etiqueta independientemente del {namespace} que caigan? Algo a lo largo de las líneas de findall('.//{wildcard}Tag')?

+0

Teniendo en cuenta esta cuestión no ha recibido una respuesta en un tiempo ahora, aquí algunas sugerencias. Si ya has resuelto tu problema, ¡genial! Pero asegúrese de publicarlo aquí para que no tengamos un [hilo de Fermat] (http://b.wardje.eu/2012/01/fermat-tread.html) en nuestras manos. Si no, un código y un ejemplo XML del problema sería útil. –

Respuesta

3

La función xpath de lxml admite local-name()!

Aquí está un ejemplo de Python 3:

import io 
from lxml import etree 
xmlstring = '''<root 
xmlns:m="http://www.w3.org/html4/" 
xmlns:n="http://www.w3.org/html5/"> 
<m:table> 
    <m:tr> 
    <m:name>Sometext</m:name> 
    </m:tr> 
</m:table> 
<n:table> 
    <n:name>Othertext</n:name> 
</n:table> 
</root>''' 
root = etree.parse(io.StringIO(xmlstring)) 
names = root.xpath("//*[local-name() = 'name']") 
for name in names: 
    print(name.text) 

Su pregunta podría haber sido antes aswered en: lxml etree xmlparser namespace problem

+0

¿Qué significa esto? ¿Lo corriste? No estoy seguro de si esto realmente funciona. –

+0

me sale este error: Rastreo (llamada más reciente pasado): xml_test.py Archivo", línea 15, en root = etree.parse (io.StringIO (xmlString)) TypeError: initial_value debe haber Unicode o Ninguno, no str –

+0

La salida real es "Sometext \ nOthertext \ n" – phobie

Cuestiones relacionadas