CDATA是XML规范中定义的一种特殊文本块标记,全称为Character Data,作用是告诉XML解析器,该标记内部的全部内容都属于纯文本,不需要进行标签识别、实体替换等解析操作,会原样保留所有字符。在XML中,小于号、大于号、与号、引号等都属于特殊字符,直接出现在文本内容中会被解析器误判为标签边界或者实体引用,使用CDATA就能很好地解决这类问题。

CDATA的基本语法规则
CDATA的语法格式是固定的,必须遵循以下规则:
- 必须以
<![CDATA[作为起始标记,其中[和CDATA之间不能有空格 - 必须以
]]>作为结束标记,两个]不能分开,后面紧跟大于号 - 起始标记和结束标记之间的所有内容都会被当作纯文本,包括换行、空格、特殊字符等都会原样保留
- CDATA块不能嵌套使用,也就是说内部不能再出现
]]>这样的结束标记字符序列
在XML中嵌入CDATA的示例
下面通过一个实际的XML示例,展示如何嵌入不需要解析的文本块。比如我们要在XML中存储一段JavaScript代码,代码里包含小于号、函数调用等内容:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<name>页面配置</name>
<script_content>
<![CDATA[
function checkAge(age) {
if (age < 18) {
return "未成年";
} else {
return "成年";
}
}
// 调用函数示例
let result = checkAge(20);
]]>
</script_content>
</config>
在这个示例中,script_content节点内部的JavaScript代码被包裹在CDATA块中,里面的<、函数调用checkAge()、双引号等内容都不会被XML解析器处理,读取该节点内容时会得到完整的原始代码文本。
CDATA的使用注意事项
不能嵌套的问题
因为CDATA的结束标记是]]>,所以如果需要在CDATA块中展示包含]]>的内容,就会出现提前结束的问题。这种情况下需要拆分内容,或者不使用CDATA,改为对特殊字符进行转义处理。
与字符转义的区别
如果不使用CDATA,也可以通过对特殊字符进行转义来让XML正确解析,比如小于号转义为<,大于号转义为>,与号转义为&。但是当内容中特殊字符很多时,转义会非常繁琐,这时候CDATA的优势就很明显,可读性也更高。下面是转义方式和CDATA的对比示例:
<!-- 使用字符转义的方式 -->
<content>
if (a < b && b > c) {}
</content>
<!-- 使用CDATA的方式 -->
<content>
<![CDATA[
if (a < b && b > c) {}
]]>
</content>
编码一致性
CDATA块内部的内容编码需要和XML文档声明的编码保持一致,否则可能会出现乱码问题。比如XML声明为UTF-8编码,那么CDATA内部的内容也需要是UTF-8编码的字符。
常见使用场景
CDATA通常用在以下场景中:
- XML中存储代码片段,比如JavaScript、SQL、HTML片段等,这些片段中往往包含大量特殊字符
- 存储包含大量与号、小于号的内容,比如数学公式、配置文件中的表达式等
- 需要原样保留文本格式的场景,比如多行文本、带缩进的代码内容,CDATA会保留所有的换行和空格
注意:CDATA是XML特有的语法,在HTML中并不支持,HTML中处理特殊字符需要通过实体转义的方式实现。