我正在尝试生成带有命名空间的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" />
答案 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
属性)以获得解决方法。