生成使用默认命名空间的 XML

Generate XML that uses a default namespace

我想使用 Python 和 lxml 生成 XML,如下所示:

<root xmlns="foo">
  <bar />
</root>

然而,下面的代码创建了 XML,它在语义上是相同的,但使用了难看的自动生成的命名空间前缀:

from lxml import etree
root = etree.Element('{foo}root')
etree.SubElement(root,'{foo}bar')
print(etree.tostring(root))
#=> b'<ns0:root xmlns:ns0="foo"><ns0:bar/></ns0:root>'

如何让 lxml/etree 在根元素上使用单个默认命名空间生成 XML,而在任何后代元素上都没有命名空间前缀?

最直接的方法是不按原样使用命名空间,而是显式设置 xmlns 属性:

from lxml import etree

root = etree.Element('root')
root.attrib["xmlns"] = "foo"

etree.SubElement(root, 'bar')

print(etree.tostring(root))

打印:

<root xmlns="foo"><bar/></root>

使用nsmap参数,在http://lxml.de/tutorial.html#namespaces

上有说明
from lxml import etree

nsmap = {None: "foo"}
root = etree.Element('{foo}root', nsmap=nsmap)
etree.SubElement(root,'{foo}bar')
print(etree.tostring(root))

输出

b'<root xmlns="foo"><bar/></root>'