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. ;-)
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
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