xml中必须转义的5个预定义字符是&、、"、’,分别用&、<、>、"、’表示;属性值中需按定界符匹配转义,文本内容中单双引号通常无需转义;推荐用CDATA处理大量特殊字符。
‘ ">
在XML中,&、‘(单引号)、"(双引号)属于预定义的特殊字符,直接写入文档会导致解析错误。必须使用对应的实体引用(entity reference)来安全表示。
必须转义的5个基础字符
XML规范只预定义了5个实体,其中与你提到相关的有:
- & → 写成 &(注意:这里显示的是字面量,实际写入时是四个字符 &)
- → <
- > → >
- " → "(用于属性值中包裹双引号内容,如
name=&quot;He said &quot;Hi&quot;&quot;) - ‘ → ‘(用于属性值中包裹单引号内容,如
desc='It's OK')
单双引号的使用场景区别
XML元素内容里写单引号或双引号通常无需转义(例如:&lt;msg&gt;He said &quot;Hello&quot;&lt;/msg&gt; 是合法的),但一旦出现在属性值中,就必须按属性定界符匹配转义:
- 用双引号包围属性值 → 属性内出现的 " 必须写成 "
- 用单引号包围属性值 → 属性内出现的 ‘ 必须写成 ‘
- 不管哪种方式,& 在属性值或文本内容中都必须统一写成 &
推荐做法:优先用CDATA区段处理大段含特殊字符的内容
如果一段文本里大量混用 &、"、'、 等,逐个转义易出错。此时可用 <code> 包裹整段内容:
里面所有字符都会被解析器原样保留,不作解析——但注意:CDATA内不能出现 ]]> 字符序列。
编程中别手动拼接,用库函数自动转义
手写XML容易遗漏或错写实体(比如写成 ∧ 这种非法形式)。实际开发中应交由XML生成库处理:
- Java:用
Transformer或DocumentBuilder输出时自动转义 - Python:用
xml.etree.ElementTree的subelement.text = "A & B",库会自动转为A & B - JavaScript(浏览器):用
DOMParser+XMLSerializer,或第三方库如xmlbuilder2
基本上就这些。核心就一条:只要字符有歧义(尤其是 &),就老实用标准实体;别图省事硬塞原始符号,解析器不会通融。