在XML文档的编写过程中,属性值是承载数据的重要部分,当属性值中包含部分特殊字符时,如果不做处理直接写入,会导致XML解析器无法正确识别文档结构,进而引发解析错误。掌握XML属性值中特殊字符的转义规则,是编写合法XML文档的基础能力。

XML属性值中需要转义的特殊字符
XML语法规定了5个必须转义的特殊字符,这些字符在属性值中出现时,都需要替换为对应的转义序列,具体对应关系如下:
| 特殊字符 | 转义序列 | 说明 |
|---|---|---|
| < | < | 小于号,XML标签的起始符号,属性值中出现会被误认为标签开始 |
| > | > | 大于号,XML标签的结束符号,属性值中出现会被误认为标签结束 |
| & | & | 和号,XML转义序列的起始符号,属性值中出现会被误认为转义开始 |
| " | " | 双引号,XML属性值的包裹符号,属性值中出现会导致属性边界识别错误 |
| ' | ' | 单引号,部分场景下可作为属性值的包裹符号,属性值中出现会导致属性边界识别错误 |
属性值转义的具体示例
下面通过几个实际的XML片段,展示不同特殊字符在属性值中的转义方式。
包含双引号的属性值转义
如果属性值中包含双引号,需要将双引号转义为",示例如下:
<?xml version="1.0" encoding="UTF-8"?> <user info="他说:"今天天气很好""></user>
包含小于号和和号的属性值转义
当属性值中同时出现小于号和和号时,需要分别转义为<和&,示例如下:
<?xml version="1.0" encoding="UTF-8"?> <config rule="数值范围<100&状态为有效"></config>
包含单引号的属性值转义
如果使用单引号包裹属性值,属性值中的单引号需要转义为',示例如下:
<?xml version="1.0" encoding="UTF-8"?> <book name='作者名:'佚名''></book>
转义错误的常见表现
如果XML属性值中的特殊字符没有正确转义,解析时通常会出现以下几类错误:
- 解析器报标签未闭合错误,通常是小于号或大于号未转义导致
- 解析器报属性值格式错误,通常是双引号或单引号未转义导致
- 解析器报转义序列错误,通常是和号未转义,被误认为转义序列起始导致
转义注意事项
除了上述5个必须转义的字符外,其他字符一般不需要转义,比如空格、中文、普通标点符号都可以直接写在属性值中。另外,转义序列本身是由和号开头、分号结尾的,不要漏写分号,否则解析器无法识别转义序列。
如果需要批量处理XML属性值中的特殊字符,也可以使用对应编程语言的XML处理库,比如Java的StringEscapeUtils类、Python的xml.sax.saxutils模块,都可以自动完成特殊字符的转义操作,避免手动转义遗漏。
# Python自动转义XML属性值示例
import xml.sax.saxutils as saxutils
# 原始属性值
raw_value = '他说:"今天温度<30°C"'
# 自动转义特殊字符
escaped_value = saxutils.escape(raw_value, {"'": "'", '"': """})
print(escaped_value)
# 输出结果:他说:"今天温度<30°C"