我经常看到人们在这里询问与XML / XSLT相关的问题,这些问题源于无法掌握CDATA的工作方式(如this one)。
我想知道 - 为什么它首先存在?不是没有XML就不能做到这一点,你可以放入CDATA部分的所有东西都可以表示为“原生”(XML转义)。
我很欣赏CDATA可能会使得到的文档变得更小,但让我们面对它 - 无论如何XML都是冗长的。例如,通过压缩可以更轻松地实现小型XML文档。
对我来说,CDATA打破了标记和数据的清晰分离,因为你可以在肉眼看到标记的数据,我觉得这是件坏事。 (这甚至可能是鼓励人们不恰当地将字符串处理或正则表达式应用于XML的事情之一。)
那么:有什么理由可以使用CDATA?
答案 0 :(得分:11)
CDATA
部分仅仅是为了方便人类作者,而不是为了程序。它们的唯一用途是使人类能够容易地包括例如XHTML页面中的SVG示例代码,无需使用<
小心地替换每个<
,等等。
这对我来说是预期的用途。不要将生成的文档缩小几个字节,因为您可以使用<
而不是<
。
再次从上面获取示例(xhtml中的SVG代码),这使我可以轻松检查XHTML文件的源代码,只需将SVG代码复制粘贴而无需再替换{{1与<
。
答案 1 :(得分:5)
PCDATA - 解析字符数据,这意味着输入的数据将由解析器解析。
CDATA - 解析器不会解析在CDATA元素之间输入的数据。解析器将忽略CDATA部分内的文本。因此,恶意用户可以使用这些CDATA元素将销毁数据发送到应用程序。
CDATA部分以<![CDATA[
开头,以]]>
结尾。
无法在CDATA中出现的唯一字符串为]]>
。
我们使用CDATA的唯一原因是:Javascript代码等文本包含大量<
,&amp;字符。为避免错误,脚本代码可以定义为CDATA,因为单独使用<
会产生错误,因为解析器会将其解释为新元素的开头。类似地,&
可以被解析器解释为字符实体的开头。
答案 2 :(得分:4)
我认为CDATA 意图允许原始二进制数据:只要它不包含“]]&gt;”然后任何事情都进入CDATA部分。这确实使它与普通XML区别开来,并且应该加速解析(并且否定全文编码的必要性,从而提供第二次性能提升)。
事实上,人们没有逃避关闭序列以及几个早期解析器遭到各种破坏的事实证明是非常有问题的,所以现在大多数人只是使用文本编码来处理二进制数据,这使得CDATA部分有点无意义,是的。
编辑:请注意,这个答案实际上是错误的,正如Tomalak在评论中指出的那样。我没有删除它,因为我知道还有其他人认为原始二进制文件在CDATA中是可以接受的,这可能会解决这个小小的误解。
答案 3 :(得分:3)
对我而言,CDATA只是懒惰的另一个词。当我开始使用XML时,我使用它,但现在我总是转换数据。
我能想出的最好的理由是,方便。特别是当您使用XML作为某种形式的包装器时,要将数据从一个系统传输到另一个系统,在这种情况下,您最终可能会得到以下结果。
创建XML包装器
将数据转换为XML
将数据放入包装器中 将XML发送给接收方
将XML拆分为XML + XML数据
将XML中的数据转换为数据
使用CDATA会导致不需要额外的转换步骤。
另一种用法可能是嵌入数据而不必关心嵌入数据中的不同命名空间。但这并不是一个很好的使用方法。
我找到了另一个使用CDATA的好方法的例子,我应该想到的一个。当您需要在XML文件中嵌入代码时,代码不应该被转换,或者它将不起作用和/或不易读取。
答案 4 :(得分:3)
我不知道这会有多大帮助,但我也会这样做:
其中一个问题是XML开发人员有几个不同的阵营,其中一些人将XML视为数据的表示,而另一些则以更强以文档为中心查看方式。 (XML的优点在于它适用于两者。)
那些将XML视为数据表示的人 - 其中XML经常由工具生成和使用,而人类只参与故障排除 - 在CDATA部分看不到什么价值,因为它没有与他们的工具不同,而那些使用XML进行更多以文档为中心的人可能会发现CDATA部分更有用。
答案 5 :(得分:2)
MXML演示了CDATA标签的大量使用。我喜欢MXML的一个原因是它是有效的XML,这意味着我可以做一些有用的事情,比如使用转换从不同的XML文件以编程方式生成flash小部件,并根据模式验证MXML。
CDATA标签在MXML中非常有用,因为它们用于在MXML文件中定义ActionScript脚本块,允许我将ECMA类型的脚本语言(带有&gt;和&lt;等等)和有效的XML组合在一个文件中。
编辑:
我认为组合MXML和ActionScript的另一个选择是将它们组合成HTML和Javascript的方式,即将脚本包装在脚本块内的XML注释标记中,并选择使用CDATA代替是由MXML编译器的开发人员制作的。我认为推理可能与编辑有关,因为MXML编辑器根据模式验证代码以检查语法并提供上下文帮助,以及解析动作脚本代码以获取语法和上下文帮助。在编辑器中使用CDATA可以同时执行这两项操作并区分XML注释和脚本块。
答案 6 :(得分:2)
如有疑问,check the spec:
2.7 CDATA章节
[定义:CDATA部分可能出现在任何可能出现字符数据的地方;它们用于转义包含字符的文本块,否则这些字符将被识别为标记。
答案 7 :(得分:1)
当您想要为某些XML定义架构时,CDATA部分非常有用,但部分XML不受您的控制,您无法确保它符合架构或不会破坏XML。
我经常需要处理具有HTML输出的遗留系统,这些系统通常不是很好的XHTML,我可以附加一个模式,确保XML被正确地结构化,但是有一个标签只包含一个CDATA部分用于容纳潜在的CDATA中的HTML不好。
这不是一种常见的用法,但当你不希望其他人的松散编程破坏你的系统时,它绝对有它的用途。
答案 8 :(得分: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文件,您都应采取相同的预防措施。