You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为XML标签添加属性且不改变原有命名空间声明

解决XML序列化时保留默认命名空间的问题

你的问题核心是xml.etree.ElementTree在处理带默认命名空间的元素时,序列化会自动将默认命名空间转为带前缀的形式,导致输出不符合预期。可以通过注册命名空间的方式解决:

修改后的代码

import xml.etree.ElementTree as ET
import time

# 注册默认命名空间,将空前缀绑定到目标URI
ET.register_namespace('', 'urn:xmpp:info')

xml_string = """
<message>
    <info xmlns="urn:xmpp:info" />
</message>
"""

root = ET.fromstring(xml_string)
ns = {'ns': 'urn:xmpp:info'}
for info in root.findall(".//ns:info", ns):
    sent_time = info.attrib.get("sent_time_millis")
    if not sent_time:
        sent_time = str(int(time.time() * 1000))
        info.attrib["sent_time_millis"] = sent_time
print(ET.tostring(root, encoding='unicode'))

关键说明

  • ET.register_namespace('', 'urn:xmpp:info'):这行代码告诉ElementTree,当遇到URI为urn:xmpp:info的命名空间时,使用空前缀(即默认命名空间)来输出,而不是自动生成ns0这类前缀。
  • 移除了原代码中多余的break(如果你的XML中只有一个<info>标签,保留也没问题,但移除后可以兼容多个<info>标签的场景)。

输出结果

运行修改后的代码,会得到符合你预期的输出:

<message>
    <info xmlns="urn:xmpp:info" sent_time_millis="1675533086777" />
</message>

内容的提问来源于stack exchange,提问作者Athena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:40:29