Python解析XML时空xmlns属性丢失,需修改属性并保留该属性
解决ElementTree序列化时丢失空xmlns属性的问题
问题原因
你调用的ET.register_namespace("", "http:www.intel.com/example")会让ElementTree将空前缀关联到父元素的命名空间。序列化无命名空间的Tag2时,ElementTree会默认省略xmlns=""声明,导致该属性丢失。另外,ElementTree解析时会把xmlns属性视为命名空间声明而非普通属性,解析后不会保留在元素的attrib字典中,所以序列化时不会自动输出。
解决方案
步骤说明
- 保留父元素的默认命名空间格式,正确注册空前缀对应父命名空间。
- 手动给
Tag2添加xmlns=""属性,强制序列化时输出该声明。
完整代码
import xml.etree.ElementTree as ET # 定义命名空间映射,用于查找目标元素 ns_map = {"intel": "http:www.intel.com/example"} # 解析XML文件 tree = ET.parse(file_path) root = tree.getroot() # 注册空前缀到父命名空间,确保父元素以默认命名空间格式输出 ET.register_namespace("", "http:www.intel.com/example") # 定位Tag2元素(父元素在命名空间内,需用命名空间映射查找) tag2 = root.find("intel:Tag2", ns_map) # 手动添加xmlns=""属性,强制序列化时保留该声明 tag2.set("xmlns", "") # 修改目标属性(示例:将attrib1的值改为200) tag2.set("attrib1", "200") # 写入修改后的XML with open(workflow_path, 'w+', encoding='utf-8') as f: # 手动写入XML声明(ElementTree默认不输出) f.write('<?xml version="1.0" encoding="utf-8"?>\n') # 手动保留原注释(ElementTree解析时会丢弃注释,无需保留可删除此行) f.write('<!--WFVersion:53.0-->\n') # 写入元素内容,指定encoding为unicode直接输出字符串 f.write(ET.tostring(root, encoding='unicode'))
注意事项
- ElementTree默认会丢弃XML注释,若需要保留注释,建议改用
lxml库(它支持保留注释和更严格的命名空间处理)。 - 若不需要保留原注释,可删除手动写入注释的代码行,直接用
ET.tostring输出内容。
内容的提问来源于stack exchange,提问作者Sandra
相关产品推荐
相关产品推荐

