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

phi*_*hag 24 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())
Run Code Online (Sandbox Code Playgroud)

命名空间被保存(doc.childNodes[0].namespaceURI'http://example.net/ns'),但为什么输出中缺少它?

<?xml version="1.0" ?>
<el/>
Run Code Online (Sandbox Code Playgroud)

我预计:

<?xml version="1.0" ?>
<el xmlns="http://example.net/ns" />
Run Code Online (Sandbox Code Playgroud)

要么

<?xml version="1.0" ?>
<randomid:el xmlns:randomid="http://example.net/ns" />
Run Code Online (Sandbox Code Playgroud)

Tom*_*lak 21

createElementNS() 定义为:

def createElementNS(self, namespaceURI, qualifiedName):
    prefix, localName = _nssplit(qualifiedName)
    e = Element(qualifiedName, namespaceURI, prefix)
    e.ownerDocument = self
    return e
Run Code Online (Sandbox Code Playgroud)

所以…

import xml.dom.minidom
doc = xml.dom.minidom.Document()
el = doc.createElementNS('http://example.net/ns', 'ex:el')
#--------------------------------------------------^^^^^
doc.appendChild(el)
print(doc.toprettyxml())
Run Code Online (Sandbox Code Playgroud)

收益率:

<?xml version="1.0" ?>
<ex:el/>
Run Code Online (Sandbox Code Playgroud)

......不完全......

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())
Run Code Online (Sandbox Code Playgroud)

收益率:

<?xml version="1.0" ?>
<ex:el xmlns:ex="http://example.net/ns"/>
Run Code Online (Sandbox Code Playgroud)

或者:

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())
Run Code Online (Sandbox Code Playgroud)

产生:

<?xml version="1.0" ?>
<el xmlns="http://example.net/ns"/>
Run Code Online (Sandbox Code Playgroud)

看起来你必须手动完成它.Element.writexml()没有迹象表明命名空间会得到任何特殊处理.

编辑:这个答案仅针对目标xml.dom.minidom,因为OP在问题中使用了它.我没有说明通常不可能在Python中使用XML命名空间.;-)


phi*_*hag 5

此功能已经提出; 一个补丁在Python bug数据库中沉睡.请参阅Tomalak的答案(简而言之:手动添加xmlns属性)以获得解决方法.