2015-11-30 20 views
14

C'è un modo per definire lo spazio dei nomi predefinito/non prefissato in Python ElementTree? Questo non sembra funzionare ...Python ElementTree namespace predefinito?

ns = {"":"http://maven.apache.org/POM/4.0.0"} 
pom = xml.etree.ElementTree.parse("pom.xml") 
print(pom.findall("version", ns)) 

Né questo:

ns = {None:"http://maven.apache.org/POM/4.0.0"} 
pom = xml.etree.ElementTree.parse("pom.xml") 
print(pom.findall("version", ns)) 

Questo lo fa, ma poi devo prefisso ogni elemento:

ns = {"mvn":"http://maven.apache.org/POM/4.0.0"} 
pom = xml.etree.ElementTree.parse("pom.xml") 
print(pom.findall("mvn:version", ns)) 

Usare Python 3.5 su OSX.

MODIFICA: se la risposta è "no", è ancora possibile ottenere la taglia :-). Voglio solo un "no" definitivo da qualcuno che ha trascorso molto tempo ad usarlo.

+0

Utilizzando 'ElementTree', devi usare un prefisso. Se usi 'lxml', puoi usare' .nsmap' invece dei prefissi hard-coding. Vedi http://stackoverflow.com/questions/14853243/parsing-xml-with-namespace-in-python-via-elementtree per dettagli – gtlambert

risposta

10

Non esiste un modo diretto per gestire in modo trasparente gli spazi dei nomi predefiniti. Assegnare lo spazio dei nomi vuoto un nome non vuoto è una soluzione comune, come hai già accennato:

ns = {"mvn":"http://maven.apache.org/POM/4.0.0"} 
pom = xml.etree.ElementTree.parse("pom.xml") 
print(pom.findall("mvn:version", ns)) 

noti che lxml.etree non permette l'uso di namespace vuote in modo esplicito. Si otterrebbe:

ValueError: prefisso namespace vuoto non è supportato in ElementPath


È possibile, però, rendere le cose più semplici, da removing the default namespace definition durante il caricamento dei dati di input XML:

import xml.etree.ElementTree as ET 
import re 

with open("pom.xml") as f: 
    xmlstring = f.read() 

# Remove the default namespace definition (xmlns="http://some/namespace") 
xmlstring = re.sub(r'\sxmlns="[^"]+"', '', xmlstring, count=1) 

pom = ET.fromstring(xmlstring) 
print(pom.findall("version")) 
+0

Per gestire le virgolette singole: 'r" "" \ s (xmlns = "[^" ] + "| \ sxmlns = '[^'] + ')" "" ' – juloo65

+0

Per correggere @ juloo65 risposta: ' '' xmlstring = re.sub (r "" "\ s (xmlns =" ​​[^ "] + "| xmlns = '[^'] + ')" "",' ', xmlstring, count = 1) '' ' – Dariosky

Problemi correlati