Etree编辑XML写入新文件时°C被转为°C的原因是什么?
转义原因
这种字符替换是XML解析器的默认合规处理逻辑,核心触发点有两个:
- 原始XML本身不符合语法规范:XML要求所有属性值必须用单/双引号包裹,你示例中
Units=°C没有加引号,etree读取阶段就会自动对属性中的非ASCII字符做实体编码修正,将°符号转换为对应的Unicode数字实体°。 - etree默认输出XML时,为了兼容所有编码环境,会自动把所有非ASCII字符、XML预定义特殊字符转义为实体形式,进一步固化了这个转义结果。
解决方案
要保留原始的°C格式,按以下步骤调整即可:
- 先修正原始XML的语法,给所有属性值加引号:
<parameter name="Temperature" Units="°C">30</parameter>,避免读取阶段的自动修正转义。 - 调用写入方法时指定正确的输出参数,示例代码如下:
import xml.etree.ElementTree as ET # 读取并修改XML的逻辑 tree = ET.parse("你的配置文件路径.xml") temp_node = tree.find('.//parameter[@name="Temperature"]') temp_node.text = "200" # 写入时添加参数关闭非ASCII字符转义 tree.write( "输出文件路径.xml", encoding="utf-8", xml_declaration=True, method="html" )
补充说明:
method="html"是核心参数,HTML输出模式下不会对UTF-8可直接表示的非ASCII字符做实体转义,即可保留原始的°C格式。如果使用lxml库的etree实现,额外添加pretty_print=True参数还可以同时保证输出文件的格式化缩进效果。
内容的提问来源于stack exchange,提问作者Brownie
相关产品推荐
相关产品推荐

