XML 中的转义字符与 CDATA 区块
在 XML 文档中,某些字符具有特殊含义(如<
和>
用于标记元素边界),直接使用会导致解析错误。为了正确表示这些特殊字符,XML 提供了两种解决方案:转义字符和CDATA 区块。
XML 转义字符
XML 预定义了 5 个转义字符(实体引用),用于表示在 XML 中有特殊含义的字符:
转义字符 | 对应原字符 | 说明 |
---|---|---|
& |
& |
表示和号(AND 符号) |
< |
< |
表示小于号 |
> |
> |
表示大于号 |
" |
" |
表示双引号 |
' |
' |
表示单引号(撇号) |
转义字符的使用场景
当文本中包含上述特殊字符时,必须使用转义字符替代,否则 XML 解析器会将其误认为 XML 语法的一部分,导致解析错误。
示例:
1 |
|
错误示例(未转义导致解析失败):
1 | <!-- 错误:<和>会被误认为元素标记 --> |
CDATA 区块
当文本中包含大量特殊字符(如代码片段、公式等)时,逐个转义会非常繁琐。XML 提供了CDATA 区块(Character Data),用于标识一段无需解析的原始文本,解析器会将其中的内容原样保留。
CDATA 的语法格式
1 | <![CDATA[ 文本内容 ]]> |
<!CDATA[
:CDATA 区块的开始标记。]]>
:CDATA 区块的结束标记(必须连续,不能有空格)。- 中间的
文本内容
可以包含任意字符(除]]>
外),包括<
、>
、&
等特殊字符,解析器不会对其进行解析。
CDATA 的使用场景
包含大量特殊字符的文本:如 HTML 代码片段、SQL 语句、数学公式等。
示例(嵌入 HTML 代码):
1
2
3
4
5
6
7
8
9
<document>
<html-snippet>
<![CDATA[
<h1>标题</h1>
<p>内容包含&符号和<标签></p>
]]>
</html-snippet>
</document>避免转义的繁琐:当文本中存在多个需要转义的字符时,CDATA 可简化书写。
示例:
1
2
3
4
5
6
7
8
<code>
<![CDATA[
if (a < b && c > d) {
System.out.println("条件成立");
}
]]>
</code>
CDATA 的注意事项
不能嵌套:CDATA 区块中不能包含
]]>
,否则解析器会误认为区块结束。仅适用于文本内容:CDATA 只能用于元素的文本内容,不能用于属性值(属性值中必须使用转义字符)。
错误示例(属性中使用 CDATA):
1
2<!-- 错误:属性值中不能使用CDATA -->
<tag attr="<![CDATA[包含&符号]]>"></tag>正确示例(属性中使用转义字符):
1
<tag attr="包含&符号"></tag> <!-- 正确:用&表示& -->
转义字符与 CDATA 的对比
特性 | 转义字符 | CDATA 区块 |
---|---|---|
使用场景 | 少量特殊字符 | 大量特殊字符或代码片段 |
书写复杂度 | 需逐个替换,较繁琐 | 一次性包裹,简单高效 |
适用位置 | 文本内容和属性值 | 仅文本内容(不能用于属性) |
限制 | 仅支持 5 个预定义字符 | 不能包含]]> |
选择建议:
- 少量特殊字符(如单个
<
或&
):使用转义字符。 - 大量特殊字符或代码片段:使用 CDATA 区块。
- 属性值中:必须使用转义字符,不能使用 CDATA
v1.3.10