2012-06-27 18 views
15

¿Hay alguna forma de ignorar el espacio de nombres XML en los nombres de elementos en elementtree.ElementTree?Python: Ignorar xmlns en elementtree.ElementTree

intento imprimir todos technicalContact tags:

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

y me sale algo como:

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

Pero lo que realmente quiero es:

technicalContact [email protected] 

¿Hay alguna manera para mostrar solo el sufijo (sans xmlns), o mejor, iterar sobre los elementos sin indicar explícitamente xmlns?

+0

Véase mi respuesta http://stackoverflow.com/a/25920989/2593383 bajo para una mayor solución general – nonagon

Respuesta

8

Se puede definir un generador de buscar de forma recursiva a través de su árbol de elementos con el fin de encontrar las etiquetas que terminan con el nombre de la etiqueta correspondiente. Por ejemplo, algo como esto:

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 

Esto sólo comprueba si hay etiquetas que terminan con tag, es decir, haciendo caso omiso de cualquier espacio de nombres que conduce. A continuación, puede iterar sobre cualquier etiqueta que desee de la siguiente manera:

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

Este generador en acción:

>>> 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

Esperemos que lo anterior responda la pregunta. Una diferencia que he notado es que 'item' en el ejemplo del generador no tiene el método' next'. Aún así, aparte de esto, se comporta de la misma manera (¿similar?) A 'etree.getiterator'. – Chris

0

siempre termino utilizando algo como

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

No soluciona el problema del iterador; aún tengo que repetir el nombre completo de la etiqueta. –

+0

No conozco ninguno de los diferentes manejadores xml para python que hacen eso. Con lxml puede usar un xlst en el xml antes de analizarlo. – lebox

+2

¿Para qué es el '[0:]'? – jadkik94