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

我经常在XML文件中发现以下奇怪的CDATA标记:

<![CDATA[some stuff]]>

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

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

答案

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>

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/

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

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

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

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

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

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

从维基百科:

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

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

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

<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>

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

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

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

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