2009-05-14 14 views
24

Próbuję wygenerować dokument XML z przestrzeniami nazw, obecnie z xml.dom.minidom Pythona:Jak generowania dokumentów XML z przestrzeniami nazw w Pythonie

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

Przestrzeń nazw jest zapisane (doc.childNodes[0].namespaceURI jest 'http://example.net/ns') ale dlaczego brakuje jej na wyjściu?

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

Spodziewam:

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

lub

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

Odpowiedz

21

createElementNS() jest zdefiniowany jako:

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

tak ...

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

plony:

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

... nie dość tam ...

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

Wynik:

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

alternatywnie:

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 produkuje:

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

Wygląda na to, że trzeba to zrobić ręcznie. Element.writexml() nie wskazuje na to, że przestrzenie nazw będą traktowane jako specjalne.

EDYCJA: Ta odpowiedź jest skierowana tylko na xml.dom.minidom, ponieważ OP użył jej w pytaniu. Nie twierdzę, że nie można w ogóle używać przestrzeni nazw XML w Pythonie. ;-)

+0

To działa, ale to dość hack. Nie pamiętam żadnej innej implementacji DOM uwzględniającej przestrzenie nazw, która tak naprawdę nie obsługuje przestrzeni nazw. Mam nadzieję, że jest jeden dla Pythona. – phihag

+0

Szukałem kodu źródłowego minidom i wygląda na to, że ten hack jest najbliższy. Obsługa "wyjścia" dla przestrzeni nazw w minidomie praktycznie nie istnieje (AFAICS), nie otrzymują specjalnego traktowania. Jednak są one przetwarzane poprawnie, więc gdy były w łańcuchu wejściowym, będą również na wyjściu. Poza tym minidom traktuje je jak zwykłe atrybuty i elementy o zabawnych nazwach. – Tomalak

Powiązane problemy