Подтвердить что ты не робот

Как сгенерировать документы XML с пространствами имен в Python

Я пытаюсь создать 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 is '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" />
4b9b3361

Ответ 2

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() не показывает никаких указаний на то, что пространства имен получат специальное лечение.

EDIT: этот ответ нацелен только на xml.dom.minidom, так как OP использовал его в вопросе. Я не указываю, что невозможно было использовать пространства имен XML в Python.; -)