XML中的<![CDATA[]]>是什么意思?

我经常在XML文件中发现这个奇怪的CDATA标签:

<![CDATA[some stuff]]>

我观察到这个CDATA标签总是出现在开头,然后是一些东西。

但有时它被使用,有时它不是。我假设它是为了标记some stuff是将在之后插入的“数据”。但是some stuff是什么样的数据?我用XML编写的任何东西都不是标记某种数据吗?

1534234 次浏览

其中包含的数据不会被解析为XML,因此不需要是有效的XML,也可以包含看似XML但并非XML的元素。

CDATA代表字符数据,这意味着这些字符串之间的数据包括可以被解释为XML标记的数据,但不应该。

CDATA和评论之间的主要区别是:

  • 作为理查德指出,CDATA仍然是文档的一部分,而注释不是。
  • 在CDATA中,您不能包含字符串]]>#1),而在注释#2无效中。
  • 参数类型引用在注释中无法识别。

这意味着给定来自一个格式良好的文档的这四个XML片段:

<!ENTITY MyParamEntity "Has been expanded">

<!--Within this comment I can use ]]>and other reserved characters like <&, ', and ", but %MyParamEntity; will not be expanded(if I retrieve the text of this node it will contain%MyParamEntity; and not "Has been expanded")and I can't place two dashes next to each other.-->

<![CDATA[Within this Character Data block I canuse double dashes as much as I want (along with <, &, ', and ")*and* %MyParamEntity; will be expanded to the text"Has been expanded" ... however, I can't usethe CEND sequence. If I need to use CEND I must escape one of thebrackets or the greater-than sign using concatenated CDATA sections.]]>

<description>An example of escaped CENDs</description><!-- This text contains a CEND ]]> --><!-- In this first case we put the ]] at the end of the first CDATA blockand the > in the second CDATA block --><data><![CDATA[This text contains a CEND ]]]]><![CDATA[>]]></data><!-- In this second case we put a ] at the end of the first CDATA blockand the ]> in the second CDATA block --><alternative><![CDATA[This text contains a CEND ]]]><![CDATA[]>]]></alternative>

它用于包含可能被视为xml的数据,因为它包含某些字符。

这样,里面的数据将被显示,但不会被解释。

通常用于在XML文档中嵌入自定义数据,例如图片或声音数据。

CDATA部分是“标记为解析器仅解释为字符数据而不是标记的元素内容部分。

在语法上,它的行为类似于注释:

<exampleOfAComment><!--Since this is a commentI can use all sorts of reserved characterslike > < " and &or write things like<foo></bar>but my document is still well-formed!--></exampleOfAComment>

…但它仍然是文件的一部分:

<exampleOfACDATA><![CDATA[Since this is a CDATA sectionI can use all sorts of reserved characterslike > < " and &or write things like<foo></bar>but my document is still well formed!]]></exampleOfACDATA>

尝试将以下内容保存为.xhtml文件(没有.html)并使用FireFox(不是Internet Explorer)打开它以查看注释和CDATA部分之间的区别;当您在浏览器中查看文档时,注释不会出现,而CDATA部分会:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" ><head><title>CDATA Example</title></head><body>
<h2>Using a Comment</h2><div id="commentExample"><!--You won't see this in the documentand can use reserved characters like< > & "--></div>
<h2>Using a CDATA Section</h2><div id="cdataExample"><![CDATA[You will see this in the documentand can use reserved characters like< > & "]]></div>
</body></html>

CDATA部分需要注意的是它们没有编码,因此无法在其中包含字符串]]>。据我所知,任何包含]]>的字符数据都必须是文本节点。同样,从DOM操作的角度来看,你不能创建包含]]>的CDATA部分:

var myEl = xmlDoc.getElementById("cdata-wrapper");myEl.appendChild(xmlDoc.createCDATASection("This section cannot contain ]]>"));

此DOM操作代码将抛出异常(在Firefox中)或导致结构不良的XML文档:http://jsfiddle.net/9NNHA/

CDATA代表字符数据。您可以使用它来转义一些字符,否则这些字符将被视为常规XML。其中的数据不会被解析。例如,如果您想传递一个包含&的URL,您可以使用CDATA来执行此操作。否则,您将收到错误,因为它将被解析为常规XML。

Cdata是您可能希望传递给xml解析器但仍未解释为xml的数据。

例如:-您有一个封装了问题/答案对象的xml。这样的开放字段可以包含任何不严格属于基本数据类型或xml定义的自定义数据类型的数据。像--这是xml注释的正确标签吗?.--你可能需要按原样传递它,而不会被xml解析器解释为另一个子元素。这里Cdata来救你了。通过声明为Cdata,你告诉解析器不要将包装为xml的数据(尽管它可能看起来像一个)

一个大的用例:您的xml包含一个程序,作为数据(例如Java的网页教程)。在这种情况下,您的数据包括一大块包含“&”和“<”的字符,但这些字符并不意味着是xml。

比较:

<example-code>while (x &lt; len &amp;&amp; !done) {print( &quot;Still working, &apos;zzz&apos;.&quot; );++x;}</example-code>

<example-code><![CDATA[while (x < len && !done) {print( "Still working, 'zzzz'." );++x;}]]></example-code>

特别是如果你要从文件中复制/粘贴这段代码(或者在预处理器中包含它),在xml文件中只包含你想要的字符是很好的,而不会将它们与XML标签/属性混淆。正如@paary提到的,其他常见用途包括嵌入包含与号的URL。最后,即使数据只包含一些特殊字符,但数据非常长(比如一章的文本),在编辑xml文件时不必对这几个实体进行编码/解编码也是很好的。

(我怀疑所有与评论的比较都有点误导/无益。

作为其使用的另一个例子:

如果您有一个RSS Feed(xml文档),并且希望在描述的显示中包含一些基本的超文本标记语言编码,您可以使用CData对其进行编码:

<item><title>Title of Feed Item</title><link>/mylink/article1</link><description><![CDATA[<p><a href="/mylink/article1"><img style="float: left; margin-right: 5px;" height="80" src="/mylink/image" alt=""/></a>Author Names<br/><em>Date</em><br/>Paragraph of text describing the article to be displayed</p>]]></description></item>

RSS阅读器提取描述并在CDATA中呈现超文本标记语言。

注意-并非所有的超文本标记语言都有效-我认为这取决于您使用的RSS阅读器。


为了解释为什么这个例子使用CData(而不是适当的pubData和dc: creator标签):这是为了使用我们没有真正格式化控制的RSS小部件进行网站显示。

这使我们能够指定包含图像的高度和位置,正确格式化作者姓名和日期等等,而不需要新的小部件。这也意味着我可以编写脚本,而不必手动添加它们。

来自wikipedia:

[在]XML文档或外部解析实体中,CDATA部分是标记为解析器要解释的元素内容部分仅作为字符数据,而不是标记。

http://en.wikipedia.org/wiki/CDATA

因此:CDATA中的文本被解析器看到,但只是作为字符而不是作为XML节点。

当我的xml元素需要存储超文本标记语言代码时,我曾经不得不使用CDATA

<codearea><![CDATA[<div> <p> my para </p> </div>]]></codearea>

所以CDATA意味着它将忽略任何可能被解释为XML标记的字符,如<和>等。

它转义了一个不能像往常一样传递给XML的字符串:

示例:

字符串中包含“&”。

您不能:

<FL val="Company Name">Dolce & Gabbana</FL>

因此,您必须使用CDATA:

<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>

请注意,只有在将文本直接放置在XML文本文件中时才需要CDATA构造。

也就是说,如果手动输入或直接以编程方式构建XML文本,则只需要使用CDATA

使用DOM处理器API或SimpleXML输入的任何文本都将被自动转义,以防止违反XML内容规则。

尽管如此,有时使用CDATA可以减少所有实体编码生成的文本大小,例如style标签中的css或script标签中的javascript,其中许多语言结构使用超文本标记语言|XML中的字符,例如<>