2015-11-30 8 views
14

क्या Python ElementTree में डिफ़ॉल्ट/अपरिक्स्ड नेमस्पेस को परिभाषित करने का कोई तरीका है? यह काम करने के लिए प्रतीत नहीं होता ...पायथन ElementTree डिफ़ॉल्ट नामस्थान?

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

न ही ऐसा करता है:

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

यह करता है, लेकिन फिर मैं हर तत्व उपसर्ग के लिए है:

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

अजगर 3.5 का उपयोग करना ओएसएक्स पर

संपादित करें: यदि उत्तर "नहीं" है, तो आप अभी भी बक्षीस प्राप्त कर सकते हैं :-)। मैं बस किसी ऐसे व्यक्ति से एक निश्चित "नहीं" चाहता हूं जिसने इसका उपयोग करके काफी समय बिताया है।

+0

'ElementTree' का उपयोग करके, आपको उपसर्ग का उपयोग करना होगा। यदि आप 'lxml' का उपयोग करते हैं, तो आप हार्ड-कोडिंग उपसर्गों के बजाय '.nsmap' का उपयोग कर सकते हैं। विवरण के लिए http://stackoverflow.com/questions/14853243/parsing-xml-with-namespace-in-python-via-elementtree देखें – gtlambert

उत्तर

10

डिफ़ॉल्ट नामस्थानों को पारदर्शी रूप से संभालने के लिए कोई सीधा-आगे तरीका नहीं है। खाली नाम स्थान नियत एक गैर खाली नाम, एक आम समाधान है के रूप में आप पहले से ही उल्लेख किया है:

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

ध्यान दें कि lxml.etree स्पष्ट रूप से खाली नामस्थान के उपयोग की अनुमति नहीं देता है। आप मिल जाएगा:

ValueError: खाली नामस्थान उपसर्ग ElementPath में समर्थित नहीं है


आप कर सकते हैं, हालांकि, चीजों को आसान बनाने के removing the default namespace definition द्वारा जबकि एक्सएमएल इनपुट डेटा लोड हो रहा:

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

सिंगल कोट्स को संभालने के लिए: 'r "" "s (xmlns =" ​​[^ " ] + "| \ sxmlns = '[^'] + ')" "" – juloo65

+0

@ juloo65 उत्तर को ठीक करने के लिए: '' xmlstring = re.sub (r "" "\ s (xmlns =" ​​[^ "] + "| xmlns = '[^'] + ')" "",' ', xmlstring, count = 1) '' ' – Dariosky

संबंधित मुद्दे