如何为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
相关产品推荐
相关产品推荐

