14

我经常看到人们在这里提出与 XML/XSLT 相关的问题,这些问题的根源在于无法掌握 CDATA 的工作原理(比如这个)。

我想知道 - 为什么它首先存在?并不是说 XML 不能没有它,您可以放入 CDATA 部分的所有内容都可以表示为“本机”(XML 转义)。

我很欣赏 CDATA 可能会使生成的文档更小一些,但让我们面对现实吧——XML 无论如何都是冗长的。例如,通过压缩可以更轻松地实现小型 XML 文档。

对我来说,CDATA 打破了标记和数据的清晰分离,因为您可以拥有肉眼看起来像标记的数据,我认为这是一件坏事。(这甚至可能是鼓励人们不充分地将字符串处理或正则表达式应用于 XML 的原因之一。)

那么:使用 CDATA 有什么好的理由呢?

4

9 回答 9

12

CDATA部分只是为了方便人类作者,而不是为程序。它们的唯一用途是使人们能够轻松地将例如 SVG 示例代码包含在 XHTML 页面中,而无需仔细替换每一个<等等&lt;

这对我来说是预期用途。不要使生成的文档小几个字节,因为您可以<使用&lt;.

同样再次从上面获取示例(xhtml 中的 SVG 代码),这使我可以轻松检查 XHTML 文件的源代码,只需将 SVG 代码复制粘贴出来,而无需再次&lt;使用<.

于 2009-11-11T10:13:51.030 回答
5

PCDATA - 已解析的字符数据,这意味着输入的数据将由解析器解析。

CDATA - 在 CDATA 元素之间输入的数据不会被解析器解析。也就是说,CDATA 部分中的文本将被解析器忽略。因此,恶意用户可以使用这些 CDATA 元素向应用程序发送破坏性数据。

CDATA 部分以 . 开头<![CDATA[和结尾]]>

CDATA 中唯一不能出现的字符串是]]>.

我们使用 CDATA 的唯一原因是:像 Javascript 代码这样的文本包含很多<, & 字符。为了避免错误,可以将脚本代码定义为 CDATA,因为<单独使用会产生错误,因为解析器将其解释为新元素的开始。同样&可以被解析器解释为字符实体的开始。

于 2009-11-13T11:16:32.677 回答
4

我相信 CDATA旨在允许原始二进制数据:只要它不包含“]]>”,那么 CDATA 部分中的任何内容。这确实使它与普通 XML 不同,并且应该加快解析速度(并否定全文编码的必要性,从而提供第二次性能提升)。实际上,事实证明,人们没有逃避结束序列并且几个早期的解析器被各种破坏,所以现在大多数只是对二进制数据使用文本编码,使得 CDATA 部分有点毫无意义,是的。

编辑:请注意,正如 Tomalak 在评论中指出的那样,这个答案实际上是错误的。我没有删除它,因为我知道还有其他人认为原始二进制文件在 CDATA 中是可以接受的,这可能会消除那个小小的误解。

于 2009-11-11T10:36:09.887 回答
3

对我来说,CDATA 只是懒惰的另一个词。当我开始使用 XML 时,我使用它,但现在我总是转换数据。

我能想到的最好的理由是,方便。尤其是当您使用 XML 作为某种形式的包装器,将数据从一个系统传输到另一个系统时,在这种情况下,您可能会遇到以下情况。

创建 XML 包装器
将数据转换为 XML
将数据放入包装器
将 XML 发送到接收器 将 XML
拆分为 XML + XML
中的数据 将 XML 中的数据转换为数据

而使用 CDATA 将导致不需要额外的转换步骤。

另一种用法可能是嵌入数据,而不必关心嵌入数据中的不同名称空间。但这并不是使用它的好方法。

我发现了另一个使用 CDATA 的好方法的例子,我应该想到的。当您需要在 XML 文件中嵌入代码时,该代码不应该被转换,否则它将无法工作和/或不容易阅读。

于 2009-11-11T10:14:03.630 回答
3

我不知道这会有多大帮助,但我也会把它扔进去:

其中一个问题是,有几个不同的 XML 开发人员阵营,其中一些人将 XML 视为数据的表示,而另一些人则以更加以文档为中心的方式来看待它。(XML 的美妙之处在于它对两者都适用。)

那些将 XML 视为数据表示的人(其中 XML 通常由工具生成和使用,而人类只参与故障排除),他们会认为 CDATA 部分没有什么价值,因为它对他们的工具,而那些将 XML 用于更多以文档为中心的目的的人可能会发现 CDATA 部分更有用。

于 2009-11-11T15:22:58.487 回答
2

MXML 演示了 CDATA 标记的大量使用。我喜欢 MXML 的一件事是它是有效的 XML,这意味着我可以做一些有用的事情,例如使用转换从不同的 XML 文件以编程方式生成 flash 小部件,并根据模式验证 MXML。

CDATA 标记在 MXML 中很有用,因为它们在 MXML 文件中定义 ActionScript 脚本块,允许我将 ECMA 类型的脚本语言(使用 > 和 < 等)和有效的 XML 组合在一个文件中。

编辑:

我想组合 MXML 和 ActionScript 的另一种选择是以组合 HTML 和 Javascript 的方式组合它们,即将脚本包装在脚本块内的 XML 注释标记中,而使用 CDATA 的选择是由MXML 编译器的开发人员。我想推理可能更多地与编辑有关,因为 MXML 编辑器根据模式验证您的代码以检查语法并提供上下文帮助,以及解析您的动作脚本代码以获得语法和上下文帮助。在编辑器中使用 CDATA 允许它同时执行并区分 XML 注释和脚本块。

于 2009-11-11T10:16:18.413 回答
2

如有疑问,请检查规范

2.7 CDATA 部分

[定义:CDATA 段可能出现在任何可能出现字符数据的地方;它们用于转义包含字符的文本块,否则这些字符会被识别为标记。

于 2009-11-11T13:12:21.027 回答
1

当您想为某些 XML 定义架构但其中一部分超出您的控制范围并且您无法确保它符合架构或不会破坏 XML 时,CDATA 部分非常有用。

我经常不得不使用具有 HTML 输出的遗留系统,这些输出通常不是格式良好的 XHTML,我可以附加一个模式,以确保 XML 的结构正确,但有一个标签,它只包含一个 CDATA 部分,用于容纳其中可能存在的错误 HTML数据。

这不是一种常见的用法,但当您不希望其他人的松散编程破坏您的系统时,它肯定有它的用途。

于 2009-11-11T14:53:03.273 回答
0

这是一个具体示例,说明为什么/何时可能要使用 CDATA

去掉 CDATA,这个简单的 SVG 将无法被浏览器解析:

<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1"
    baseProfile="full"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    >

<title>CDATA</title>

<style type="text/css"><![CDATA[

/**
 * Imagine you mention this element <foo> in a comment… or use the & sign.
 * Then…
 *
 * If this weren't wrapped into CDATA (mind both the starting and closing
 * tags), then the browser would fail to parse the file correctly. For example:
 *
 * Firefox would fail with this:
 * > XML Parsing Error: mismatched tag. Expected: [foo's closing tag].
 *
 * Chrome and Safari would fail with this:
 * > This page contains the following errors:
 * > error on line 22 at column 9: Opening and ending tag mismatch: foo line 0 and style
 */

]]></style>


<text x="20" y="60" font-size="60">Hello</text>

<script><![CDATA[

// <text>
// see comment in the CSS, because it's the same situation here.

]]></script>
</svg>

这是针对 SVG 文件的,但您应该对任何 XML 文件采取相同的预防措施。

于 2020-02-19T15:04:45.553 回答