如何在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. 全场景必须转义的字符
&→&:XML中&是实体引用的起始符,必须转义<→<:避免被解析为标签起始符>→>:避免被解析为标签结束符
2. 仅属性值中需转义的字符
"→":当属性值用双引号包裹时,属性内的双引号必须转义(如<item name="John"s book">)'→':当属性值用单引号包裹时,属性内的单引号必须转义(如<item name='John's book'>)
3. 无需转义的场景
元素文本内容中的"和'不需要转义,XML解析器会正常识别,不会影响文档结构。
内容的提问来源于stack exchange,提问作者user765443
相关产品推荐
相关产品推荐

