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

What does <![CDATA[]]> in XML mean?

提问人:dontWatchMyProfile 提问时间:5/7/2010 最后编辑:jpaughdontWatchMyProfile 更新时间:10/11/2021 访问量:1628061

问:

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

<![CDATA[some stuff]]>

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

但有时它被使用,有时它没有被使用。我假设这是标记之后将插入的“数据”。但是什么样的数据呢?我用XML标签写的任何内容都不是某种数据吗?some stuffsome stuff

XML 数据

评论


答:

37赞 fbrereto 5/7/2010 #1

其中包含的数据不会被解析为 XML,因此不需要是有效的 XML,也可以包含可能看起来像 XML 但实际上不是的元素。

1206赞 Sean Vieira 5/7/2010 #2

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>

评论

42赞 Thomas Weller 9/25/2015
如何对 CEND 序列的字符进行转义?
32赞 Sean Vieira 9/27/2015
您必须有两个 CDATA 部分来连接 和 - 请参阅此答案,了解方法和原因。]]>
2赞 Ben Sewards 10/21/2016
CDATA 开始和原始数据之间是否必须有一个换行符?
2赞 Sean Vieira 10/21/2016
不,没有@BenSewards
7赞 Anders Marzi Tornblad 3/22/2017
因此,这段类似 C 的代码不能轻易地放在 CDATA 部分: .if (a[b[c]]>10) { }
7赞 Ikke 5/7/2010 #3

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

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

0赞 Johan 5/7/2010 #4

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

评论

3赞 Joel Mueller 5/7/2010
尽管可以将文本编码的二进制数据放在 CDATA 部分中,但不必这样做,因为 CDATA 与二进制文件没有任何直接关系。
369赞 Richard JP Le Guen 5/7/2010 #5

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>

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

<?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赞 bjan 7/13/2013
那么为什么 CDATA 中不允许使用“ý”呢?
14赞 Richard JP Le Guen 7/13/2013
@bjan - 是什么让你认为这是一个非法角色?听起来您可能有编码问题。
0赞 bjan 7/13/2013
我在IE中打开了文档,我也在使用MSXML解析器,该解析器将其声明为无效字符。我有一个 xsd,其中它被声明为“type=”xs:string“”。它与编码或 xml 版本有关吗?
0赞 bjan 7/13/2013
CDATA 被解析,这里也只允许有效的字符范围,它用于转义包含字符的文本块,否则这些字符将被识别为标记
1赞 Kaz 10/3/2013
因此,我们可以使用 CDATA 将一些 HTML 偷运到 XML 文档中,这样 HTML 就不会混淆 XML 文档结构,然后稍后使用 XSLT 将其拉出并吐出到正在输出的 HTML 文档中。
12赞 paary 5/10/2012 #6

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

2赞 randomness 11/20/2013 #7

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

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

82赞 not-just-yeti 5/28/2014 #8

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

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

评论

0赞 Peter Krauss 10/10/2021
但是,请避免不分青红皂白地使用 CDATA
20赞 LadyCygnus 9/23/2014 #9

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

如果您有一个 RSS 源(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小部件的网站显示,我们没有真正的格式控制。

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

18赞 Chdid 1/15/2015 #10

来自维基百科:

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

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

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

52赞 Octane 5/14/2015 #11

当我的 xml 元素需要存储 HTML 代码时,我曾经不得不使用 CDATA。类似的东西

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

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

评论

2赞 Ludovic Kuty 5/12/2016
不是“标签”,而是第一句话中的元素。
16赞 HoangYell 3/25/2019 #12

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

例:

字符串中包含“&”。

您不能:

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

因此,必须使用 CDATA:

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

评论

8赞 Balázs Varga 9/12/2022
你一定是假的,你可以简单地将其编码为 .这不是说明为什么 CDATA 有用的好例子。Dolce &amp; Gabbana
1赞 Patanjali 5/6/2020 #13

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

也就是说,您只需要使用手动键入或直接以编程方式构建 XML 文本。CDATA

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

尽管如此,有时 using 可以减小文本大小,否则所有实体都编码会产生文本大小,例如标记中的 css 或标记中的 javascript,其中许多语言结构使用 HTML|XML 中的字符,如 和 。CDATAstylescript<>