如何使用Python中的命名空间生成XML文档

时间:2009-05-14 14:51:01

标签: python xml dom namespaces

我正在尝试生成带有命名空间的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 个答案:

答案 0 :(得分: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,因为OP在问题中使用了它。我没有说明通常不可能在Python中使用XML命名空间。 ; - )

答案 1 :(得分:5)

此功能已经提出;补丁是slumbering in the Python bug database。请参阅Tomalak的答案(简而言之:手动添加xmlns属性)以获得解决方法。