如何在XML文件中正确插入&符号 解决ElementTree自动二次转义问题
问题原因
你遇到的是Python标准库xml.etree.ElementTree(简称ET)的默认自动转义机制导致的问题:ET在写入XML属性值时,会自动把所有&字符转义为&。你提前写在var1里的
中的&会被二次转义,最终输出就变成了
,你提前做的replace('&', '&')操作不会生效,因为替换完成后ET生成XML时还会再做一次自动转义。
解决方案
方案1:生成XML字符串后统一替换(推荐,操作最简单)
如果你的需求只是固定输出
实体,直接在ET生成完整XML字符串后做一次全局替换即可:
import xml.etree.ElementTree as ET # 你的原有XML构造逻辑不变 var1 = '\r\n' var2 = f' + {res} {na}{var1}' case = ET.SubElement( suite, "testcase", { "name": f"{na}", "log": var2 } ) # 生成XML字符串后替换目标字符 xml_str = ET.tostring(suite, encoding='unicode') xml_str = xml_str.replace('\r\n', '
') # 后续直接用xml_str输出或写入文件即可 print(xml_str)
方案2:临时修改ET转义规则(适合大量自定义实体场景)
如果你需要保留更多自定义XML实体不想被转义,可以临时覆盖ET的属性转义函数:
import xml.etree.ElementTree as ET # 备份原始转义函数 original_escape = ET._escape_attrib # 自定义转义逻辑 def custom_escape(s): # 先处理< > " '等必须转义的字符 s = original_escape(s) # 把被转义的&还原为& return s.replace('&', '&') # 替换ET默认转义函数 ET._escape_attrib = custom_escape # 原有XML构造逻辑不变 var1 = '
' var2 = f' + {res} {na}{var1}' case = ET.SubElement( suite, "testcase", { "name": f"{na}", "log": var2 } ) # 生成输出 xml_str = ET.tostring(suite, encoding='unicode') print(xml_str) # 用完恢复原始转义函数,避免影响其他逻辑 ET._escape_attrib = original_escape
内容的提问来源于stack exchange,提问作者Abhishek Rai
相关产品推荐
相关产品推荐

