1

lxml2.3とetreeの名前空間に問題があります。

たとえば、名前空間が異なる2つのノードがあります。

parent = etree.Element('{parent-space}parent')
child = etree.Element('{child-space}child')

その後、childノードがノードに追加されparentます。

parent.append(child)

次に、tostringetreeのメソッドを使用すると、次の出力が得られます。

<ns0:parent xmlns:ns0="parent-space">
    <ns0:child xmlns:ns0="child-space"/>
</ns0:parent>

両方の名前空間がns0ここでラベルを取得するため、衝突します。どうすればこれを回避できますか?

4

2 に答える 2

3

衝突はありません。ns0プレフィックスは、 の子孫に対して上書きされるだけです<child>

この XML ドキュメント

<ns0:parent xmlns:ns0="parent-space">
    <ns0:child xmlns:ns0="child-space"/>
</ns0:parent>

と同等です

<ns0:parent xmlns:ns0="parent-space">
    <ns1:child xmlns:ns1="child-space"/>
</ns0:parent>

<parent xmlns="parent-space">
    <child xmlns="child-space"/>
</parent>

parentとの有効な名前空間に関する限りchild

プレフィックスを宣言するために nsmap を使用できます。効果的な結果は同じですが、シリアル化すると混乱が少なくなります。

from lxml import etree

NS_MAP = {
    "p" : "http://parent-space.com/",
    "c" : "http://child-space.com/"
}
NS_PARENT = "{%s}" % NS_MAP["parent"]
NS_CHILD = "{%s}" % NS_MAP["child"]

parent = etree.Element(NS_PARENT + "parent", nsmap=NS_MAP)
child  = etree.SubElement(parent, NS_CHILD + "child")
child.text = "Some Text"

print etree.tostring(parent, pretty_print=True)

これは印刷します

<p:parent xmlns:p="http://parent-space.com/" xmlns:c="http://child-space.com/">
  <c:child>Some Text</c:child>
</p:parent>
于 2012-09-20T08:47:07.020 に答える
0

この投稿のようです 使用が推奨される場所cleanup_namespaces

これが役立つことを願っています

于 2012-09-20T08:45:26.637 に答える