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


1014

我经常CDATAXML文件中找到这个奇怪的标签:

<![CDATA[some stuff]]>

我观察到,此CDATA标签始终位于开头,然后再添加一些内容。

但有时会使用,有时却不会。我假设这是要标记的some stuff是将在此之后插入的“数据”。但是什么样的数据some stuff呢?我用XML标签写的东西不是某种数据吗?

Answers:


951

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

CDATA和注释之间的主要区别是:

这意味着从一个格式正确的文档中给出以下四个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 can
use 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 use
the CEND sequence. If I need to use CEND I must escape one of the
brackets 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 block
     and 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 block
     and the ]> in the second CDATA block -->
<alternative><![CDATA[This text contains a CEND ]]]><![CDATA[]>]]></alternative>

35
CEND序列的字符如何转义?
Thomas Weller

23
您必须有两个 CDATA部分才能将]]和连接在一起>-有关此方法和原因的信息,请参见此答案
肖恩·维埃拉

2
在CDATA开始和原始数据之间必须有换行符吗?
本·塞沃斯

2
不,没有@BenSewards
Sean Vieira

5
因此,无法将这段类似于C的代码放入CDATA部分:中if (a[b[c]]>10) { }
Anders Tornblad

341

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

从句法上讲,它的行为类似于注释:

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

...但是它仍然是文档的一部分:

<exampleOfACDATA>
<![CDATA[
    Since this is a CDATA section
    I can use all sorts of reserved characters
    like > < " 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 document
and can use reserved characters like
< > & "
-->
</div>

<h2>Using a CDATA Section</h2>
<div id="cdataExample">
<![CDATA[
You will see this in the document
and 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/


3
那么,为什么CDATA中不允许使用“ý”?
2013年1

10
@bjan-是什么让您认为这是非法字符?听起来您可能有编码问题。
理查德JP Le Guen

我在IE中打开了该文档,我也正在使用MSXML解析器将其声明为无效字符。我有一个xsd,其中它声明为“ type =” xs:string“”。它与编码或xml版本有关吗?
2013年1

CDATA被解析,这里也只允许有效范围的字符,它用于转义包含字符的文本块,否则这些字符将被视为标记
bjan

1
因此,我们可以使用CDATA将一些HTML走私到XML文档中,以使HTML不会混淆XML文档的结构,然后在以后使用XSLT将其拉出并将其吐入正在输出的HTML文档中。
卡兹(Kaz)

69

一个大用例:您的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文件时不必对这几个实体进行编码/解码也很不错。 。

(我怀疑所有对评论的比较都具有误导性/无益。)


41

当我的xml元素需要存储HTML代码时,我曾经不得不使用CDATA。就像是

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

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


2
不是“标签”,而是第一句中的元素。
Ludovic Kuty

32

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


16

从维基百科:

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

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

因此:解析器可以看到CDATA中的文本,但只能将其视为字符,而不能将其视为XML节点。


13

作为其用法的另一个示例:

如果您具有RSS Feed(xml文档),并且想要在描述的显示中包括一些基本的HTML编码,则可以使用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中呈现HTML。

注意-并非所有HTML标记都能正常工作-我认为这取决于您使用的RSS阅读器。


并解释为什么此示例使用CData(而不是适当的pubData和dc:creator标签):这是用于使用RSS窗口小部件的网站显示,对此我们没有实际的格式设置控件。

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


9

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


6

它用于包含数据,否则它可以视为xml,因为它包含某些字符。

这样,将显示但不解释内部数据。


5

它转义了无法照常传递给XML的字符串:

例:

字符串中包含“&”。

你不能:

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

因此,您必须使用CDATA:

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

1

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


3
尽管您可以将文本编码的二进制数据放在CDATA节中,但是不必这样做,因为CDATA与二进制文件没有直接关系。
乔尔·穆勒

1

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

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


0

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

也就是说,仅CDATA在手动输入或以编程方式直接构建XML文本时才需要使用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.