CDATA是什么 如何在XML中用它来包含特殊字符

10次阅读

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

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 内容不提供语法高亮或校验,写 jshtml 时容易漏掉括号或引号,错误要到运行时才暴露
  • 如果 XML 要被 XPath 查询或 XSLT 处理,text() 函数仍能取到 CDATA 内容,但 normalize-space() 等函数行为与普通文本一致
  • 生成 XML 的代码(如 pythonxml.etree.ElementTree)默认不生成 CDATA,需手动拼接字符串或换用支持 CDATA 的库(如 lxml

最麻烦的是:当你不确定目标系统是否严格遵循 XML 规范时,CDATA 可能被当作普通文本处理(比如某些老旧的 java SAX 解析器配置不当),这时候反而不如老老实实用 &

text=ZqhQzanResources