没有冲突。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
and child
go 的有效命名空间而言。
您可以使用 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>