使用 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"/>
我正在尝试构建一个 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"/>