CDATA是XML规范中定义的一段文本区域,全称为Character Data,它的作用是让XML解析器把该区域内的所有内容都当作普通文本处理,不会对内容进行解析,因此可以用来包含XML中具有特殊含义的字符,避免解析错误。

CDATA的基本定义
XML解析器在解析文档时,会把<、>、&等字符当作语法标记的一部分,比如<表示标签开始,&表示实体引用的开始。如果文本内容中需要包含这些字符,直接写入就会破坏XML的语法结构,导致解析失败。CDATA就是为了解决这个问题而存在的,它会告诉解析器,区域内的内容不需要解析,直接当作原始文本处理。
CDATA的语法格式
CDATA的语法有固定的格式,必须严格按照以下规则编写:
- 以
<![CDATA[开头,注意开头是固定的字符组合,没有空格 - 以
]]>结尾,同样没有空格 - 开头和结尾之间是要包含的原始文本内容
- CDATA不能嵌套使用,也就是CDATA内部不能再出现
]]>字符,否则会被当作结束标记
CDATA的使用示例
下面通过几个实际的例子展示CDATA的使用场景和效果。
普通文本包含特殊字符的错误示例
如果直接在XML元素中写入包含小于号的数学公式,XML会解析报错:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<formula>1 < 2</formula>
</root>
上面的代码中,<formula>元素的内容包含<字符,解析器会认为<是新的标签开始,导致语法错误。
使用CDATA包含特殊字符的正确示例
用CDATA包裹特殊字符后,就可以正常解析:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<formula><![CDATA[1 < 2]]></formula>
<sql><![CDATA[SELECT * FROM user WHERE age > 18 AND name = 'test']]></sql>
<config><![CDATA[param1=value1¶m2=value2]]></config>
</root>
上面的代码中,formula元素里的小于号、sql元素里的大于号和&符号、config元素里的&符号都被CDATA包裹,解析器不会解析这些字符,整个XML文档可以正常解析。
Java中生成包含CDATA的XML示例
在Java代码中生成XML时,也可以使用CDATA包裹特殊内容:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class XmlCdataDemo {
public static void main(String[] args) {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("root");
Element content = root.addElement("content");
// 添加CDATA内容
content.addCDATA("这是包含特殊字符的内容:<>&");
System.out.println(document.asXML());
}
}
CDATA的使用注意事项
- CDATA不能嵌套,因为CDATA的结束标记是
]]>,如果内容中包含这个组合,会被提前当作结束标记,导致内容截断。如果确实需要包含]]>,可以拆分多个CDATA区域,或者用实体转义的方式处理。 - CDATA一般用于元素内容中,不能用于属性值。如果属性值中包含特殊字符,需要使用对应的实体转义,比如<转义为
<,>转义为>,&转义为&。 - CDATA内部的文本不会进行实体解析,所以即使里面写了
<这样的实体,也会被当作普通文本,不会转义为小于号。
CDATA和实体转义的区别
处理XML中的特殊字符有两种方式,一种是使用CDATA,一种是使用实体转义,两者的区别如下:
| 对比项 | CDATA | 实体转义 |
|---|---|---|
| 适用场景 | 大量特殊字符的文本内容,比如代码片段、SQL语句、配置文件内容等 | 少量特殊字符,或者属性值中的特殊字符 |
| 可读性 | 原始内容直接展示,可读性好 | 转义后内容可读性差,比如<会变成< |
| 语法限制 | 不能嵌套,不能包含]]> | 没有嵌套限制,所有特殊字符都有对应的转义实体 |
需要注意的是,CDATA是XML特有的语法,在HTML中并不支持,HTML中处理特殊字符只能通过实体转义的方式实现。