2009-05-14 8 views
24

में नामस्थान मैं नामस्थान के साथ एक XML दस्तावेज उत्पन्न करने के लिए कोशिश कर रहा हूँ के साथ एक्सएमएल दस्तावेजों उत्पन्न करने के लिए:कैसे, वर्तमान में पायथन के xml.dom.minidom साथ अजगर

import xml.dom.minidom 
doc = xml.dom.minidom.Document() 
el = doc.createElementNS('http://example.net/ns', 'el') 
doc.appendChild(el) 
print(doc.toprettyxml()) 

नाम स्थान सहेजा जाता है (doc.childNodes[0].namespaceURI'http://example.net/ns' है), लेकिन आउटपुट में यह क्यों गुम है?

<?xml version="1.0" ?> 
<el/> 

मैं उम्मीद:

<?xml version="1.0" ?> 
<el xmlns="http://example.net/ns" /> 

या

<?xml version="1.0" ?> 
<randomid:el xmlns:randomid="http://example.net/ns" /> 

उत्तर

5

यह सुविधा पहले ही प्रस्तावित है; एक पैच slumbering in the Python bug database है। टॉमलाक का जवाब देखें (संक्षेप में: वर्कअराउंड के लिए मैन्युअल रूप से xmlns विशेषता जोड़ें)।

21

createElementNS() परिभाषित किया गया है के रूप में:

def createElementNS(self, namespaceURI, qualifiedName): 
    prefix, localName = _nssplit(qualifiedName) 
    e = Element(qualifiedName, namespaceURI, prefix) 
    e.ownerDocument = self 
    return e 

तो ...

0,123,
import xml.dom.minidom 
doc = xml.dom.minidom.Document() 
el = doc.createElementNS('http://example.net/ns', 'ex:el') 
#--------------------------------------------------^^^^^ 
doc.appendChild(el) 
print(doc.toprettyxml()) 

पैदावार:

<?xml version="1.0" ?> 
<ex:el/> 

... काफी वहाँ नहीं ...

import xml.dom.minidom 
doc = xml.dom.minidom.Document() 
el = doc.createElementNS('http://example.net/ns', 'ex:el') 
el.setAttribute("xmlns:ex", "http://example.net/ns") 
doc.appendChild(el) 
print(doc.toprettyxml()) 

पैदावार:

<?xml version="1.0" ?> 
<ex:el xmlns:ex="http://example.net/ns"/> 

वैकल्पिक:

import xml.dom.minidom 
doc = xml.dom.minidom.Document() 
el = doc.createElementNS('http://example.net/ns', 'el') 
el.setAttribute("xmlns", "http://example.net/ns") 
doc.appendChild(el) 
print(doc.toprettyxml()) 

जो पैदा करता है:

<?xml version="1.0" ?> 
<el xmlns="http://example.net/ns"/> 

ऐसा लगता है कि आप इसे मैन्युअल रूप से करना होगा। Element.writexml() कोई संकेत नहीं दिखाता है कि नामस्थानों को कोई विशेष उपचार मिलेगा।

संपादित करें: यह उत्तर केवल xml.dom.minidom पर लक्षित है, क्योंकि ओपी ने इसे प्रश्न में इस्तेमाल किया था। मैं इंगित नहीं करता कि आमतौर पर पाइथन में एक्सएमएल नेमस्पेस का उपयोग करना असंभव था। ;-)

+0

यह काम करता है, लेकिन यह काफी हैक है। मुझे किसी भी अन्य नामस्थान-जागरूक डीओएम कार्यान्वयन को याद नहीं किया जा सकता है जो वास्तव में नामस्थानों का समर्थन नहीं करता है। मुझे आशा है कि पाइथन के लिए भी एक है। – phihag

+0

मैं मिनीडोम के लिए स्रोत कोड देख रहा था, और ऐसा लगता है कि यह हैक सबसे नज़दीक है जिसे आप प्राप्त कर सकते हैं। मिनीडॉम में नेमस्पेस के लिए "आउटपुट" समर्थन वास्तव में अस्तित्वहीन नहीं है (AFAICS), उन्हें कोई विशेष उपचार नहीं मिलता है। हालांकि उन्हें सही ढंग से पार्स किया जाता है, इसलिए जब वे इनपुट स्ट्रिंग में थे, तो वे आउटपुट में भी होंगे। उस minidom के अलावा उन्हें सामान्य गुणों और मजेदार नाम वाले तत्वों के रूप में व्यवहार करता है। – Tomalak

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