2009-11-09 7 views
26

J'aime la façon dont ElementTree analyse xml, en particulier la fonction Xpath. J'ai une sortie en XML à partir d'une application avec des balises imbriquées.python: xml.etree.ElementTree, supprimer "namespaces"

Je voudrais accéder à ces étiquettes par nom sans spécifier l'espace de noms, est-ce possible? Par exemple:

root.findall("/molpro/job") 

au lieu de:

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

Je souhaite ajouter une note. Dans mon exemple, l'espace de noms est le même, mais dans le fichier XML entier, il existe d'autres espaces de noms variables. Je veux juste désactiver cette fonctionnalité, comme dans l'analyseur xml.dom.minidom. – pygabriel

Répondre

8

Au moins avec lxml2, il est possible de réduire cette surcharge un peu:

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

Vous pouvez écrire votre propre fonction pour envelopper la bits de mauvaise apparence par exemple:

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

Pas si amusant que j'avoue mais au moins vous serez capable de lire vos expressions xpath.