2012-06-27 12 views
15

C'è un modo per ignorare lo spazio dei nomi XML nei nomi di tage in elementtree.ElementTree?Python: ignora xmlns in elementtree.ElementTree

provo a stampare tutti technicalContact tags:

for item in root.getiterator(tag='{http://www.example.com}technicalContact'): 
     print item.tag, item.text 

e ottengo qualcosa di simile:

{http://www.example.com}technicalContact [email protected] 

Ma quello che voglio veramente è:

technicalContact [email protected] 

C'è un modo per visualizzare solo il suffisso (sans xmlns), o meglio - iterare sugli elementi senza dichiarare esplicitamente xmlns?

+0

Vedere la mia risposta sotto http://stackoverflow.com/a/25920989/2593383 per una più soluzione generale – nonagon

risposta

8

È possibile definire un generatore per cercare ricorsivamente attraverso il vostro albero di elemento al fine di trovare i tag che finiscono con il nome del tag appropriato. Per esempio, qualcosa di simile:

def get_element_by_tag(element, tag): 
    if element.tag.endswith(tag): 
     yield element 
    for child in element: 
     for g in get_element_by_tag(child, tag): 
      yield g 

Questa verifica solo per i tag che finiscono con tag, ossia ignorando qualsiasi spazio dei nomi di primo piano. È quindi possibile iterare su ogni tag che si desidera nel modo seguente:

for item in get_element_by_tag(elemettree, 'technicalContact'): 
    ... 

Questo generatore in azione:

>>> xml_str = """<root xmlns="http://www.example.com"> 
... <technicalContact>Test1</technicalContact> 
... <technicalContact>Test2</technicalContact> 
... </root> 
... """ 

xml_etree = etree.fromstring(xml_str) 

>>> for item in get_element_by_tag(xml_etree, 'technicalContact') 
...  print item.tag, item.text 
... 
{http://www.example.com}technicalContact Test1 
{http://www.example.com}technicalContact Test2 
+0

Speriamo che quanto sopra risponda alla domanda. Una differenza che ho notato è che 'item' nell'esempio generatore non ha un metodo' next'. Tuttavia, a parte questo, si comporta nello stesso modo (simile?) Di "etree.getiterator'. – Chris

0

finisco sempre utilizzando qualcosa come

item.tag.split("}")[1][0:] 
+0

Non risolve il problema dell'iteratore: devo ancora ripetere il nome completo del tag. –

+0

Non sono a conoscenza di nessuno dei diversi gestori xml per python che lo faccia. Con lxml potresti usare un xlst sul xml prima di analizzarlo. – lebox

+2

Qual è il '[0:]' per? – jadkik94