XML 中的 CDATA(Character Data)节是一种特殊的机制,用于包含不会被 XML 解析器解析的文本内容。当需要在 XML 文档中包含特殊字符(如 <、>、& 等)或代码片段时,CDATA 节非常有用。
CDATA 的基本语法
CDATA 节以 <![CDATA[ 开始,以 ]]> 结束:
xml<description> <![CDATA[ 这里可以包含任何字符,包括 < > & 等特殊字符 这些字符不会被 XML 解析器解析 ]]> </description>
CDATA 的使用场景
1. 包含代码片段
xml<code> <![CDATA[ function hello() { if (x < 10) { return "Hello"; } } ]]> </code>
2. 包含数学公式
xml<formula> <![CDATA[ E = mc² x < y && y > z ]]> </formula>
3. 包含 HTML 或 XML 片段
xml<content> <![CDATA[ <div class="header"> <p>Welcome to <strong>XML</strong></p> </div> ]]> </content>
4. 包含特殊字符数据
xml<data> <![CDATA[ Special characters: < > & " ' Comparison: 5 < 10, 20 > 15 ]]> </data>
CDATA 的限制和注意事项
-
不能嵌套:CDATA 节不能嵌套使用
xml<!-- 错误:CDATA 不能嵌套 --> <data> <![CDATA[ Outer CDATA <![CDATA[Inner CDATA]]> ]]> </data> -
不能包含结束标记:CDATA 节内部不能包含
]]>字符串xml<!-- 错误:包含结束标记 --> <data> <![CDATA[ This contains ]]> which is not allowed ]]> </data> -
大小写敏感:CDATA 标记必须大写
xml<!-- 错误:CDATA 必须大写 --> <data> <![cdata[This is wrong]]> </data> -
空白字符保留:CDATA 节内的所有空白字符都会被保留
xml<data> <![CDATA[ Line 1 Line 2 Indented line ]]> </data>
CDATA 与实体引用的对比
| 特性 | CDATA | 实体引用 |
|---|---|---|
| 语法 | <![CDATA[内容]]> | < > & 等 |
| 可读性 | 高,直接显示原始内容 | 低,需要转换 |
| 适用范围 | 大段文本 | 单个字符 |
| 性能 | 稍好,减少解析开销 | 稍差,需要解析实体 |
| 灵活性 | 低,不能部分使用 | 高,可以精确控制 |
何时使用 CDATA
适合使用 CDATA 的情况:
- 包含大量特殊字符的文本
- 需要保留原始格式的代码片段
- 包含其他标记语言(HTML、JavaScript 等)
- 需要避免频繁的字符转义
不适合使用 CDATA 的情况:
- 只包含少量特殊字符
- 需要对内容进行部分处理
- 内容中可能包含
]]>字符串 - 需要与其他 XML 处理工具兼容
CDATA 的实际应用示例
1. Web 服务配置
xml<configuration> <script> <![CDATA[ $(document).ready(function() { $("#button").click(function() { if (count < 10) { alert("Click count: " + count); } }); }); ]]> </script> </configuration>
2. 数据库查询存储
xml<queries> <query id="getUser"> <![CDATA[ SELECT * FROM users WHERE age > 18 AND status = 'active' ORDER BY name ASC ]]> </query> </queries>
3. 模板内容
xml<template> <![CDATA[ <html> <head><title>${title}</title></head> <body> <h1>Welcome, ${username}!</h1> <p>Your balance is: $${balance}</p> </body> </html> ]]> </template>
CDATA 在不同语言中的处理
Java DOM 解析
javaElement element = document.createElement("description"); CDATASection cdata = document.createCDATASection("Text with <special> characters"); element.appendChild(cdata);
Python ElementTree
pythonimport xml.etree.ElementTree as ET element = ET.Element("description") element.text = "Text with <special> characters" # ElementTree 会自动转义特殊字符
CDATA 节是 XML 中处理特殊字符和原始文本内容的重要工具,合理使用可以提高 XML 文档的可读性和维护性。