Skip to content

XML CDATA

默认情况下,XML 文档中的所有文本内容都会被 XML 解析器解析。

然而,包含在 CDATA 区块中的文本被视为原始字符数据,并被解析器忽略。

XML 解析器会处理在元素的开始标签和结束标签之间找到的文本内容。此内容称为已解析字符数据(Parsed Character Data,简称 PCDATA)。

例如,在以下片段中,文本 “This text is also parsed” 是 PCDATA:

<message>This text is also parsed</message>

解析器需要处理这些数据,因为它可能包含嵌套的 XML 元素,需要进一步分解。考虑以下示例:

<name>
<first>Bill</first>
<last>Gates</last>
</name>

解析器识别 <first> 和 <last> 是 <name> 中的子元素,并解释文档的结构。

PCDATA 是处理 XML 中文本内容的标准方式,它允许嵌套结构和实体处理。

CDATA 指的是你希望 XML 解析器完全忽略的文本块。它将内容视为字面字符,而不解释任何可能的标记。

这一点至关重要,因为某些字符在 XML 中具有特殊含义,主要是 <(开始一个标签)和 &(开始一个实体)。在元素内容中直接包含这些字符可能会导致解析错误。

例如,< 会让解析器认为一个新的元素开始了。

& 会让解析器期望一个有效的实体引用(如 &amp; 或 &lt;)。

包含代码片段(如 JavaScript 或 XML 示例)的文本通常包含这些字符。为了防止错误,此类内容可以用 CDATA 区块包裹起来。

CDATA 区块以 <![CDATA[ 开始,以 ]]> 结束。介于两者之间的所有内容都会不经解析直接通过。

<script type="application/javascript">
<![CDATA[
function compareValues(a, b) {
if (a < b && a < 0) { // 这里的 '<' 和 '&' 字符是安全的
return 1;
} else {
return 0;
}
}
]]>
</script>

在上面的示例中,CDATA 区块内的 JavaScript 代码被 XML 解析器忽略,从而防止了由 < 和 && 运算符引起的错误。

关于 CDATA 区块的重要注意事项:

  • CDATA 区块不能包含字面字符串 ]]>。如果你需要包含此序列,则必须分割 CDATA 区块。
  • 不允许嵌套 CDATA 区块。
  • 结束标记 ]]> 中不应有空格或换行符。

虽然 CDATA 很有用,但过度使用有时可能表明 XML 不是数据处理的最佳格式(例如,嵌入大型、复杂的非 XML 块)。如果这种情况经常发生,请考虑替代方案。