cdata区段是xml中唯一能原样保留特殊字符而不触发解析错误的机制,必须严格遵循结尾且中间不含]]>的规则,用于html片段、sqlxml说明文本等“不用就崩”的场景。

CDATA 区段不是“可选的美化语法”,而是 XML 中唯一能**原样保留特殊字符而不触发解析错误**的机制。它不改变结构,也不提升性能,只解决一个硬性问题:怎么把带 、<code>& 的内容(比如代码片段、HTML 片段、SQL 语句)塞进 XML 元素里还不被解析器当标记处理。
为什么不用实体编码而要用 CDATA?
实体编码(如 、<code>&)确实合法,但有明显短板:
– 多层嵌套时极易出错(比如 HTML 里再嵌一段含 <script></script> 的代码,要手动转义三层)
– 可读性归零,调试时几乎无法直视
– 某些场景下根本不可控(例如从外部系统接收未转义的 HTML 字符串,你没法要求对方先做实体化)
而 CDATA 是“开关式”的:只要没出现 ]]>,中间所有字符一律按字面量处理——包括 、<code>&、]],甚至 UTF-8 控制字符(只要合法)。
CDATA 怎么写?常见格式错误有哪些?
标准写法只有这一种:,三部分缺一不可:
– 开头必须是 (注意左括号紧贴,不能有空格)<br>– 结尾必须是 <code>]]>(注意是两个 ] 加一个 >,顺序和数量都不能错)
– 中间不能出现子字符串 ]]>,否则解析器会提前截断,导致后续 XML 错乱或报错 XML parser error: expected ']]>'
典型翻车现场:
– 把 写成 <code>(多空格)→ 解析失败<br>– 在内容里拼出 <code>]]>(哪怕只是注释或日志)→ 提前闭合,后半段变裸文本
– 用编辑器自动补全把 ]]> 补成 ]]> → 实际插入了字符实体,不是结束符
哪些场景非用 CDATA 不可?
不是“能用就用”,而是“不用就崩”:
– 往 XML 配置中注入完整 HTML 片段(如邮件模板字段)
– 在 SQLXML 查询结果中返回含标签的说明文本(如 sql:use-cdata="1" 属性控制的列)
– Web Service 响应中携带客户端需原样渲染的 JS/CSS 代码块
– 日志聚合系统把带 XML 特征的原始请求体存为 XML 子节点
注意:二进制数据(如图片 Base64)不能放 CDATA,它只处理文本;非法 Unicode(如 U+FFFE)仍会报错,CDATA 不豁免字符合法性校验。
语言/工具里怎么生成 CDATA?别手拼
手写 看似简单,实则高危——尤其动态拼接时容易漏转义或插错位置。
推荐方式:
– .NET(XElement / XCData):直接 new XCData("内容"),编译器自动生成合法结构
– Java(JAXB / DOM):用 Document.createCDATASection("内容"),不要用 setTextContent
– Python(lxml):用 etree.CDATA("内容") 包裹,而非字符串插值
– SQL Server(SQLXML):在 XSLT 或 FOR XML 查询中设 sql:use-cdata="1" 属性,由引擎自动包裹
手拼只适用于静态、已知无 ]]> 的短文本,且必须肉眼确认三次。
CDATA”,而是“怎么确保内容里没有 ]]>”。很多团队卡在这一步,最后退回去用实体编码凑合——结果某天上游数据突然带了右方括号组合,整个 XML 流就 silently 截断了。









