如何在Python中生成带有命名空间的XML文档

24 投票
2 回答
10546 浏览
提问于 2025-04-15 11:35

我正在尝试用Python的xml.dom.minidom生成一个带有命名空间的XML文档:

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

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,因为提问者在问题中使用了它。我并不是说在Python中使用XML命名空间是不可能的。;-)

5

这个功能已经有人提出来了;一个修复方案正在Python的错误数据库中等待处理。可以看看Tomalak的回答(简单来说:手动添加xmlns属性)来找到解决办法。

撰写回答