CDATA是XML中用于原样包裹文本的解析指令,要求以结尾,中间禁止出现连续的]]>,且不可嵌套;它使解析器跳过内容转义与标签识别,仅作纯字符串处理。

CDATA 是 XML 中用来「原样包裹文本」的机制,不是标签也不是元素,而是一种解析指令。它让 XML 解析器跳过其中的内容,不进行实体转义、不识别标签、不校验结构——换句话说, 里的内容,就当纯字符串看。
CDATA 的语法和基本用法
必须严格使用 开头、]]> 结尾,中间不能出现连续的 ]]> 字符序列(否则会被误认为结束标记)。
- 合法:
hello & world]]> - 非法:
bar]]>(因为]]>提前闭合) - 不能嵌套:XML 不支持
...]]>
为什么不用 CDATA 就会出错?
XML 默认要求所有特殊字符必须转义。比如 、&、] 出现在文本中时,解析器会认为是标签开始、实体引用或标记边界,导致报错:
上面这段如果直接写进 XML 元素体里, 和 && 都会触发解析错误。改成 CDATA 就能绕过:
0) { ... }
]]>
CDATA 和字符实体(如
二者目的都是表达特殊字符,但行为完全不同:
是把编码为实体,解析后还原成,仍受上下文约束(比如不能出现在属性值里未转义)-
是让解析器彻底忽略语法含义,整个块当黑盒处理 - CDATA 不影响命名空间、属性解析、DTD 校验等外部规则;它只作用于当前文本节点的内容部分
- 某些 XML 工具链(如 XSLT 处理器或 DOM 实现)可能对 CDATA 节点做特殊对待(例如
node.nodeType === Node.CDATA_SECTION_NODE)
容易踩的坑
实际写 XML 时,这几个细节常被忽略:
- CDATA 结束标记
]]>必须连续、不能有空格或换行,否则解析失败 - 很多编辑器/IDE 对 CDATA 内容不提供语法高亮或校验,写 JS 或 HTML 时容易漏掉括号或引号,错误要到运行时才暴露
- 如果 XML 要被 XPath 查询或 XSLT 处理,
text()函数仍能取到 CDATA 内容,但normalize-space()等函数行为与普通文本一致 - 生成 XML 的代码(如 Python 的
xml.etree.ElementTree)默认不生成 CDATA,需手动拼接字符串或换用支持 CDATA 的库(如lxml)
最麻烦的是:当你不确定目标系统是否严格遵循 XML 规范时,CDATA 可能被当作普通文本处理(比如某些老旧的 Java SAX 解析器配置不当),这时候反而不如老老实实用 和 &。









