在XML文档的处理场景中,属性值里包含未转义的&符号是非常常见的错误诱因,这种问题会直接导致XML解析器无法正确识别文档结构,抛出解析异常。很多开发者在拼接属性值内容时容易忽略特殊字符的转义要求,进而引发后续的数据处理和接口调用故障。

未转义的&符号会引发什么问题
XML解析器在读取文档时,会把&符号识别为实体引用的起始标记。如果&后面没有跟着合法的实体名称或者#开头的字符编码,解析器就会判定文档格式错误。比如下面这段错误的XML代码:
<user info="name=张三&age=20" />
上面的属性值里直接使用了&符号连接参数,解析器读取到&时,会尝试查找名为age的实体,找不到就会报错,导致整个XML文档无法被正常解析。
XML属性值的编码规范
XML中一共有5个预定义的特殊字符,在属性值中出现时必须进行转义,对应的转义规则如下:
| 原始字符 | 转义后字符 | 说明 |
|---|---|---|
| < | < | 小于号,避免被识别为标签起始 |
| > | > | 大于号,避免被识别为标签结束 |
| & | & | 和号,避免被识别为实体引用起始 |
| ' | ' | 单引号,属性值用单引号包裹时使用 |
| " | " | 双引号,属性值用双引号包裹时使用 |
除了这5个预定义字符,如果属性值中包含其他特殊字符,也可以使用&#字符的Unicode编码;的形式进行转义,比如空格的编码是 ,但这种用法在属性值中较少见,优先使用预定义转义规则即可。
正确的实例演示
针对前面出现的错误示例,正确的写法应该是把&符号转义为&:
<user info="name=张三&age=20" />
如果是用单引号包裹属性值,内部出现单引号就需要转义:
<book title='XML入门'实战指南' />
下面再举一个包含多种特殊字符的属性值示例:
<config desc="最大并发数<100&超时时间>30s" version="1.0" />
这段XML的属性值里包含了<、>、&三个特殊字符,都按照规范做了转义,解析器可以正常识别内容。
编码时的注意事项
- 不要在转义后的字符之间插入空格,比如& amp;是错误的写法,必须是&
- 如果是动态拼接属性值,建议在拼接完成后统一做一次特殊字符转义处理,避免遗漏
- CDATA段不能用于属性值中,属性值的特殊字符只能通过转义的方式处理
掌握XML属性值的转义规范后,就可以有效避免因为特殊字符导致的解析错误,保证XML文档的兼容性和规范性。