2016-11-01 155 views
1

我想用Python和lxml的生成XML像下面的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?

+0

阅读http://lxml.de/tutorial.html#namespaces –

+0

@LutzHorn也许我缺少一个句子,但教程(我读过)仅介绍如何_QUERY_反对默认名称空间,而不是如何获得序列化来_emit_默认名称空间。 – Phrogz

+1

再次阅读:)(或阅读下面的答案) –

回答

4

使用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>' 
3

最简单的方法是为的是不使用的命名空间,但将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> 
+1

我可能不会接受这个答案,因为这是一个肮脏的黑客攻击,但我几乎肯定会在我的代码中使用*这个答案,因为这是一个_delightfully_ dirty hack。 – Phrogz