2016-11-01 154 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