2016-11-01 1 views
1

を使用してXMLを生成します。は、私は次のようなXMLを生成するPythonとlxmlのを使用するデフォルトの名前空間

<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>' 

にはどうすれば任意の子孫要素には名前空間接頭辞で、ルート要素上の単一のデフォルトの名前空間を使用してXMLを生成するlxmlの/ etreeを得るのですか?

+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_汚いハックなので、私のコードでこの答えを使うことになるだろう。 – Phrogz

関連する問題