1

我在 lxml 2.3 和 etree 中的命名空间有问题。

例如,我有两个具有不同命名空间的节点:

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>

parentand childgo 的有效命名空间而言。

您可以使用 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

看起来像这篇文章How to tell lxml.etree.tostring(element) not to write namespaces in python? 建议使用的地方cleanup_namespaces

希望这会有所帮助

于 2012-09-20T08:45:26.637 回答