2011-11-20 11 views
7

Sto lavorando con alcuni dati XML che, in alcune posizioni in ciascun file, ridefiniscono lo spazio dei nomi. Sto cercando di estrarre tutti i tag di un tipo specifico dal documento indipendentemente dallo spazio dei nomi attivo nel punto in cui il tag risiede nell'XML.Parse XML con Python Etree e tag specificato restituito indipendentemente dallo spazio dei nomi

Sto usando findall('.//{namespace}Tag') per trovare gli elementi che sto cercando. Ma non sapendo mai quale sarà il {namespace} in un dato punto del file, mancherà o meno se otterrò o meno tutti i Tag richiesti.

C'è un modo per restituire tutti gli elementi di tag indipendentemente dal {namespace} che rientrano? Qualcosa sulla falsariga di findall('.//{wildcard}Tag')?

+0

Tenuto conto di questa domanda non ha ottenuto una risposta in qualche tempo, ecco alcuni suggerimenti. Se hai già risolto il tuo problema, bene! Ma assicurati di postarlo anche qui in modo da non avere un [Filo di Fermat] (http://b.wardje.eu/2012/01/fermat-tread.html) nelle nostre mani. In caso contrario, un codice e un esempio XML del problema sarebbero utili. –

risposta

3

La funzione xpath di lxml supporta local-name()!

Ecco un esempio 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) 

La tua domanda potrebbe essere stato aswered prima al: lxml etree xmlparser namespace problem

+0

cosa fa questo output. l'hai eseguito? Non sono sicuro che funzioni effettivamente. –

+0

ottengo questo errore: Traceback (chiamata più recente scorso): File xml_test.py", linea 15, in root = etree.parse (io.StringIO (xmlString)) TypeError: valore_iniziale deve essere Unicode o None, not str –

+0

L'output effettivo è "Sometext \ nOthertext \ n" – phobie

Problemi correlati