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