如何在Python中生成带有命名空间的XML文档
我正在尝试用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
属性)来找到解决办法。