2009-05-14 5 views
24

Sto cercando di generare un documento XML con spazi dei nomi, attualmente con xml.dom.minidom di Python:come generare documenti XML con spazi dei nomi in Python

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

Lo spazio dei nomi viene salvato (doc.childNodes[0].namespaceURI è 'http://example.net/ns'), ma perché manca nell'output?

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

mi aspetto:

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

o

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

risposta

21

createElementNS() è definito come:

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

così ...

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()) 

rendimenti:

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

... non del tutto lì ...

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()) 

rendimenti:

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

in alternativa:

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()) 

Wich produce:

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

Sembra che dovreste farlo manualmente. Element.writexml() non indica che gli spazi dei nomi otterrebbero un trattamento speciale.

MODIFICA: questa risposta è indirizzata solo a xml.dom.minidom, poiché l'OP lo ha utilizzato nella domanda. Non indico che fosse impossibile usare gli spazi dei nomi XML in Python in generale. ;-)

+0

Questo funziona, ma è piuttosto un hack. Non riesco a ricordare nessun'altra implementazione DOM in grado di riconoscere lo spazio dei nomi che non supporta gli spazi dei nomi. Spero che ce ne sia uno anche per Python. – phihag

+0

Stavo cercando un codice sorgente per minidom, e sembra che questo trucco sia il più vicino possibile. Il supporto "output" per gli spazi dei nomi in minidom è praticamente inesistente (AFAICS), non ricevono alcun trattamento speciale. Tuttavia vengono analizzati correttamente, quindi quando sono nella stringa di input, saranno anche nell'output. Oltre a questo minidom li tratta come normali attributi ed elementi con nomi divertenti. – Tomalak