2015-11-30 25 views
14

Python ElementTree'de varsayılan/düzeltilmemiş ad alanını tanımlamanın bir yolu var mı? Bu Python ElementTree varsayılan ad alanı?

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

Nor

bunu yapar ... çalışmak görünmüyor:

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

Bu yapar ama sonra her eleman önek vardır:

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

Python 3.5 kullanma OSX'de.

DÜZENLEME: eğer cevap "hayır" ise, yine de lütuf kazanabilirsiniz :-). Sadece bunu kullanarak çok zaman harcayan birinden kesin bir "hayır" istiyorum.

+0

'ElementTree' kullanarak, bir önek kullanmanız gerekir. Eğer 'lxml 'kullanıyorsanız, kodlama önekleri yerine' .nsmap' kullanabilirsiniz. Ayrıntılar için http://stackoverflow.com/questions/14853243/parsing-xml-with-namespace-in-python-via-elementtree adresine bakın. – gtlambert

cevap

10

Varsayılan ad alanlarını saydam bir şekilde işlemek için düz ileri bir yol yoktur. Eğer daha önce bahsettiğimiz gibi boş ad alanı boş olmayan bir isim atama, ortak bir çözümdür: açıkça boş ad kullanılmasına izin vermez

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

Not lxml.etree söyledi. Sen alacağı:

ValueError: Boş ad alanı öneki ElementPath desteklenmez


yapabilirsiniz olsa XML giriş verilerini yüklenirken removing the default namespace definition tarafından, İşleri basitleştirmek:

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

Tek tırnak işaretleri için: "r" "" \ s (xmlns = "[^" ] + "| \ sxmlns = '[^'] + ')" "" – juloo65

+0

@ juloo65 düzeltmesi için: '' 'xmlstring = re.sub (r" "" \ s (xmlns = "[^"] + "| xmlns = '[^'] + ')" "",' ', xmlstring, count = 1) '' ' – Dariosky