使用 lxml 为 XML 文档设置属性

Setting an attribute for XML document using lxml

我正在尝试构建一个 XML 文件,其中我的主节点具有一些属性:

<cbnp-message:cbnp-message xmlns:cbnp-message="some_value" xmlns="some_value2">

我正在尝试使用 Python3 和 lxml 库来实现这一点,到目前为止,我设法为 some_value2 设置了 xmlns 参数。我不能做的是设置 cnbp-message:cnbp-message 东西(抱歉我没有正确命名:我不是每天都使用 XMLs ).

这里的棘手之处在于阻止我在创建 XML 文件之前对此类信息进行硬编码是上述 XML 的结束标记必须以

结尾
</cbnp-message:cnbp-message> 

对于如何处理此类任务的所有想法和建议,我将不胜感激。

我已经尝试使用 cnbp-message:cbnp-message 名称创建一个节点,但它不起作用(引发 ValueError:无效的标签名称异常)

这些不是普通属性;那些是 namespace declarations.

此声明:xmlns:cbnp-message="some_value" 将名称空间 uri some_value 绑定到前缀 cbnp-message

此声明:xmlns="some_value2" 是默认名称空间(因为 uri 未绑定到前缀)。

您可以在 lxml 中做的是使用 "nsmap" 将前缀映射到 uris。对于默认名称空间,前缀应为 None.

为了避免 "Invalid tag name" 异常,您还需要使用 QName() 构建限定名称(这是 Clark Notation 中的名称空间 uri 和本地名称(示例: {some_value}cbnp-message)).

See here 有关 lxml 中名称空间的更多信息。

See here(或 James Clark 上面的 link 页面)以了解有关一般命名空间的更多信息。

示例...

from lxml import etree

nsmap = {None: "some_value2", "cbnp-message": "some_value"}

message = etree.Element(etree.QName(nsmap.get("cbnp-message"), "cbnp-message"), nsmap=nsmap)

etree.dump(message)

输出...

<cbnp-message:cbnp-message xmlns:cbnp-message="some_value" xmlns="some_value2"/>