生成使用默认命名空间的 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>'
我想使用 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>'