2009-11-09 14 views
26

Me gusta la manera en que ElementTree analiza xml, en particular la función Xpath. Tengo un resultado en xml de una aplicación con etiquetas anidadas.python: xml.etree.ElementTree, quitando "espacios de nombres"

Me gustaría acceder a estas etiquetas por nombre sin especificar el espacio de nombres, ¿es posible? Por ejemplo:

root.findall("/molpro/job") 

en lugar de:

root.findall("{http://www.molpro.net/schema/molpro2006}molpro/{http://www.molpro.net/schema/molpro2006}job") 
+1

Quiero agregar una nota, en mi ejemplo, el espacio de nombres es el mismo, pero en todo el archivo Xml hay otros espacios de nombres de variables. Solo quiero desactivar esta característica, como en el analizador xml.dom.minidom. – pygabriel

Respuesta

8

Al menos con lxml2, es posible reducir esta sobrecarga un poco:

root.findall("/n:molpro/n:job", 
      namespaces=dict(n="http://www.molpro.net/schema/molpro2006")) 
5

Se puede escribir su propia función para envolver el bits de aspecto desagradable, por ejemplo:

def my_xpath(doc, ns, xp); 
    num = xp.count('/') 
    new_xp = xp.replace('/', '/{%s}') 
    ns_tup = (ns,) * num 
    doc.findall(new_xp % ns_tup) 

namespace = 'http://www.molpro.net/schema/molpro2006' 
my_xpath(root, namespace, '/molpro/job') 

No es muy divertido, lo admito, pero al menos podrá leer sus expresiones xpath.