Python解析XML时如何保留未使用的命名空间?
解决ElementTree无法保留所有XML命名空间的问题
xml.etree.ElementTree在序列化XML时,只会保留实际被元素或属性引用的命名空间声明,未被使用的会自动丢弃。要完全保留原始所有xmlns前缀属性,需要手动提取并重新添加这些声明,同时注册所有命名空间避免前缀被替换。
修改后的Python代码
import xml.etree.ElementTree as xml # 解析原始XML messageFlowFile = xml.parse('sample.xml') messageFlowRoot = messageFlowFile.getroot() # 1. 收集根元素上所有原始的命名空间声明(xmlns:* 属性) original_namespaces = {} for attr_key, attr_value in messageFlowRoot.attrib.items(): if attr_key.startswith('xmlns:'): original_namespaces[attr_key] = attr_value # 同时注册这些命名空间,避免输出时用默认前缀 prefix = attr_key.split(':', 1)[1] xml.register_namespace(prefix, attr_value) # 2. 重新添加所有原始命名空间声明到根元素 messageFlowRoot.attrib.update(original_namespaces) # 3. 写入文件 messageFlowFile.write('NewMessage.xml', encoding='UTF-8', xml_declaration=True)
代码说明
- 遍历根元素属性,筛选出所有
xmlns:开头的命名空间声明并保存 - 对每个命名空间调用
register_namespace,防止ElementTree输出时用ns0这类默认前缀替代原始前缀 - 将收集到的所有命名空间声明重新添加到根元素属性中,确保未被使用的命名空间也能保留
- 写入文件后,输出XML会完全保留原始的所有命名空间信息
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

