2015-11-30 15 views
14

Gibt es eine Möglichkeit, den Standard-Namespace ohne Präfix in Python ElementTree zu definieren? Dies scheint nicht zu arbeiten ...Python ElementTree Standard-Namespace?

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

auch nicht dies:

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

Dies tut, aber dann muss ich jedes Element Präfix:

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

Verwendung von Python 3.5 auf OSX.

EDIT: Wenn die Antwort "Nein" ist, können Sie immer noch das Kopfgeld bekommen :-). Ich will nur ein definitives "Nein" von jemandem, der viel Zeit damit verbracht hat, es zu benutzen.

+0

Mit 'ElementTree' müssen Sie ein Präfix verwenden. Wenn Sie 'lxml' verwenden, können Sie' .nsmap' anstelle von hartkodierenden Präfixen verwenden. Siehe http://stackoverflow.com/questions/14853243/parsing-xml-with-namespace-in-python-via-elementtree für Details – gtlambert

Antwort

10

Es gibt keine direkte Möglichkeit, die Standardnamespaces transparent zu behandeln. Die leeren Namensraum einen nicht leeren Namen zuweisen ist eine gemeinsame Lösung, wie Sie bereits erwähnt haben:

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

Beachten Sie, dass lxml.etree nicht die Verwendung von leeren Namensräume explizit erlauben. Sie erhalten würden:

ValueError: leer Namespacepräfix nicht


Sie können aber in ElementPath unterstützt die Dinge einfacher, durch removing the default namespace definition während die XML-Eingangsdaten geladen:

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

Um einfache Anführungszeichen zu behandeln: 'r" "" \ s (xmlns = "[^" ] + "| \ sxmlns = '[^'] + ')" "'' – juloo65

+0

Um @juloo65 zu beheben Antwort: '' 'xmlstring = re (r" "" \ s (xmlns = "[^"] + "| xmlns = '[^'] + ')" "", "', xmlstring, count = 1)' '' – Dariosky

Verwandte Themen