You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XML写入时保留原始字符串,避免转义字符转换?

XML保留双引号及转义字符处理方案

一、解决双引号被双重转义的问题

你当前代码出现双重转义,是因为xml.etree.ElementTree.tostring()会先将双引号转义为",再经minidom.parseString()二次处理时,又把&转义为&,最终变成"。以下是两种可行解决方法:

方法1:直接使用minidom构建XML(推荐)

通过minidom直接创建文本节点,可避免不必要的转义,代码如下:

from xml.dom import minidom

# 创建XML文档对象
doc = minidom.Document()
# 根节点
data = doc.createElement("data")
doc.appendChild(data)

# 子节点testdata
testdata = doc.createElement("testdata")
data.appendChild(testdata)

# user节点及文本
user = doc.createElement("user")
# 直接创建带双引号的文本节点
user_text = doc.createTextNode('"dummy"')
user.appendChild(user_text)
testdata.appendChild(user)

# 生成格式化XML
xmlstr = doc.toprettyxml(indent="   ")
print(xmlstr)

方法2:使用ElementTree的indent美化(Python 3.9+)

如果偏好ElementTree,可利用Python 3.9新增的indent()方法美化XML,跳过minidom的二次转义:

import xml.etree.ElementTree as ET

data = ET.Element("data")
m_data = ET.SubElement(data, "testdata")
ET.SubElement(m_data, "user").text = '"dummy"'

# 美化XML缩进
ET.indent(data, space="   ")
# 直接生成Unicode格式的XML字符串
xmlstr = ET.tostring(data, encoding='unicode')
print(xmlstr)

两种方法的输出均符合期望:

<?xml version="1.0" ?>
<data>
   <testdata>
      <user>"dummy"</user>
   </testdata>
</data>

二、XML转义字符完整处理规则

XML中有5个需转义的字符,处理规则分场景:

1. 全场景必须转义的字符

  • & → &amp;:XML中&是实体引用的起始符,必须转义
  • < → &lt;:避免被解析为标签起始符
  • > → &gt;:避免被解析为标签结束符

2. 仅属性值中需转义的字符

  • " → &quot;:当属性值用双引号包裹时,属性内的双引号必须转义(如<item name="John&quot;s book">)
  • ' → &apos;:当属性值用单引号包裹时,属性内的单引号必须转义(如<item name='John&apos;s book'>)

3. 无需转义的场景

元素文本内容中的"和'不需要转义,XML解析器会正常识别,不会影响文档结构。

内容的提问来源于stack exchange,提问作者user765443

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:01:00