Как генерировать XML-документы с пространствами имен в Python - PullRequest
24 голосов
/ 14 мая 2009

Я пытаюсь сгенерировать документ XML с пространствами имен, в настоящее время с Python 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" />

Ответы [ 2 ]

21 голосов
/ 14 мая 2009

createElementNS() определяется как:

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

так ...

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, так как ОП использовал его в вопросе. Я не указываю, что вообще невозможно было использовать пространства имен XML в Python. ; -)

5 голосов
/ 15 мая 2009

Эта функция уже предложена; патч дремлет в базе данных ошибок Python . См. Ответ Томалака (вкратце: вручную добавьте атрибут xmlns) для обхода проблемы.

...