XML中的CDATA是用于标记一段文本内容,让XML解析器将其中的内容当作纯字符数据处理,不会尝试解析其中的XML特殊字符。在XML规范中,像<、>、&这类字符属于特殊语法符号,如果直接出现在元素内容中,解析器会将其识别为XML标签或实体引用的开始,进而导致解析错误。

CDATA的核心作用
CDATA的全称是Character Data,即字符数据,它的核心作用是解决XML内容中包含特殊字符时的解析冲突问题。当我们需要在XML元素中存放包含XML特殊语法的文本时,比如代码片段、SQL语句、包含&符号的文本内容,就可以用CDATA包裹这些内容,解析器会直接跳过CDATA区块的解析,将其中的内容原封不动地作为文本返回。
常见的需要用到CDATA的场景包括:
- XML中存放HTML片段,其中包含<div>、<p>等HTML标签
- 存放包含&符号的文本内容,比如"Tom & Jerry"
- 存放SQL查询语句,其中包含<、>等比较运算符
- 存放正则表达式,其中包含大量特殊符号
CDATA的语法规则
CDATA有固定的语法格式,必须严格按照以下规则编写:
- CDATA区块以
<![CDATA[开头 - CDATA区块以
]]>结尾 - 开头和结尾标记之间不能嵌套另一个CDATA区块
- 开头和结尾标记之间不能出现
]]>字符串,否则会被识别为CDATA的结束 - CDATA只能用在XML元素的内容中,不能用于XML属性值
CDATA使用示例
基础使用示例
下面是一个简单的XML示例,展示CDATA的基本用法:
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>张三</name>
<desc><![CDATA[这是一段包含特殊字符的内容:<test> & "hello"<]]></desc>
</user>
上面的XML中,desc元素的内容被CDATA包裹,即使里面包含<、&这类特殊字符,XML解析器也不会报错,会直接将<test> & "hello"作为desc元素的文本内容。
存放代码片段的示例
如果需要在XML中存放JavaScript代码片段,使用CDATA可以避免解析错误:
<?xml version="1.0" encoding="UTF-8"?>
<page>
<title>示例页面</title>
<script><![CDATA[
function add(a, b) {
return a + b;
}
// 判断a是否大于b
if (a > b) {
console.log("a更大");
}
]]></script>
</page>
错误用法示例
下面是常见的CDATA错误用法,需要注意避免:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<!-- 错误1:CDATA嵌套CDATA -->
<content><![CDATA[外层<![CDATA[内层]]>]]></content>
<!-- 错误2:CDATA中包含]]> -->
<content><![CDATA[包含结束符]]>的内容]]></content>
<!-- 错误3:CDATA用在属性中 -->
<item desc="<![CDATA[属性内容]]>" />
</root>
CDATA和转义字符的区别
很多开发者会混淆CDATA和XML转义字符的作用,两者的对比如下:
| 对比项 | CDATA | 转义字符 |
|---|---|---|
| 作用 | 标记一段内容不解析,原样保留 | 将特殊字符转换为XML可识别的实体 |
| 适用场景 | 大量特殊字符的场景,比如代码片段 | 少量特殊字符的场景 |
| 语法复杂度 | 语法简单,直接包裹内容即可 | 需要逐个替换特殊字符 |
| 可读性 | 内容原样显示,可读性好 | 转义后内容可读性差 |
比如同样的内容,使用转义字符的写法是:
<desc>这是一段包含特殊字符的内容:<test> & "hello"</desc>
可以看到转义后的内容可读性明显下降,而CDATA的写法更直观。
注意事项
使用CDATA时还需要注意以下几点:
- CDATA不是XML标签,只是解析器的处理指令,不会出现在解析后的DOM节点中
- 不同的XML解析器对CDATA的处理逻辑一致,不需要担心兼容性问题
- 如果CDATA区块的内容需要包含
]]>,可以将内容拆分,用多个CDATA拼接,比如<![CDATA[内容前半部分]]]]><![CDATA[>内容后半部分]]> - 在编写XML时,不要滥用CDATA,只有确实需要包含特殊字符的场景才使用,避免不必要的语法冗余
CDATA是XML规范中定义的标准语法,所有符合XML规范的解析器都支持该特性,使用时只需要遵循固定的语法格式即可。