XML 中的 <![CDATA[]]> 是啥意思?
Posted
技术标签:
【中文标题】XML 中的 <![CDATA[]]> 是啥意思?【英文标题】:What does <![CDATA[]]> in XML mean?XML 中的 <![CDATA[]]> 是什么意思? 【发布时间】:2011-02-16 13:42:21 【问题描述】:我经常在XML
文件中发现这个奇怪的CDATA
标签:
<![CDATA[some stuff]]>
我观察到这个CDATA
标签总是出现在开头,然后是一些东西。
但有时它被使用,有时它不是。我假设这是为了标记some stuff
是之后将插入的“数据”。但是some stuff
是什么数据呢?我在 XML 标签中写的东西不就是某种数据吗?
【问题讨论】:
【参考方案1】:CDATA 代表Character Data,这意味着这些字符串之间的数据包含可以被解释为 XML 标记但不应该被解释的数据。
CDATA 和 cmets 的主要区别是:
作为Richard points out,CDATA 仍然是文档的一部分,而注释不是。 在 CDATA 中不能包含字符串]]>
(CDEnd
),而在注释中包含 --
is invalid。
Parameter Entity 在 cmets 内部无法识别引用。
这意味着从一个格式良好的文档中给出这四个 XML 的 sn-ps:
<!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>
【讨论】:
如何对CEND序列的字符进行转义? 您必须有 两个 CDATA 部分来连接]]
和 >
- 请参阅 this answer 了解如何和为什么。
CDATA 开始和原始数据之间是否必须有一个换行符?
不,没有@BenSewards
所以这段类似 C 的代码不能轻易放在 CDATA 部分:if (a[b[c]]>10)
。【参考方案2】:
CDATA 部分是“a section of element content that is marked for the parser to interpret as only character data, not markup.”
在语法上,它的行为类似于注释:
<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/
【讨论】:
那为什么 CDATA 中不允许使用“ý”? @bjan - 是什么让你认为这是一个非法字符?听起来你可能有编码问题。 我在 IE 中打开了文档,我也在使用 MSXML 解析器,它声明它为无效字符。我有一个 xsd,其中它被声明为“type="xs:string"”。是和编码还是xml版本有关? CDATA 被解析并且这里也只允许有效范围的字符,它用于转义包含字符的文本块,否则这些字符会被识别为标记 所以我们可以使用CDATA将一些HTML偷偷带入XML文档中,这样HTML就不会混淆XML文档结构,然后再使用XSLT将其拉出来吐成HTML正在输出的文档。【参考方案3】:一个大用例:您的 xml 包含一个程序,作为数据(例如 Java 的网页教程)。在这种情况下,您的数据包含大量字符,包括“&”和“
比较:
<example-code>
while (x < len && !done)
print( "Still working, 'zzz'." );
++x;
</example-code>
与
<example-code><![CDATA[
while (x < len && !done)
print( "Still working, 'zzzz'." );
++x;
]]></example-code>
特别是如果您从文件中复制/粘贴此代码(或将其包含在预处理器中),最好在 xml 文件中包含您想要的字符,而不会将它们与 XML 标签混淆/属性。正如@paary 提到的,其他常见用途包括嵌入包含与号的 URL 时。最后,即使数据只包含一些特殊字符但数据非常非常长(比如一章的文本),在编辑 xml 文件时不必对这几个实体进行编码/解码也很好.
(我怀疑所有与 cmets 的比较都具有误导性/无益。)
【讨论】:
但是,请avoid the indiscriminate use of CDATA。【参考方案4】:当我的 xml 元素需要存储 HTML 代码时,我曾经不得不使用 CDATA。类似的东西
<codearea>
<![CDATA[
<div> <p> my para </p> </div>
]]>
</codearea>
所以 CDATA 意味着它将忽略任何可能被解释为 XML 标记的字符,如 等。
【讨论】:
不是“标签”,而是第一句中的元素。【参考方案5】:其中包含的数据不会被解析为 XML,因此不需要是有效的 XML,也可以包含看似 XML 但不是的元素。
【讨论】:
【参考方案6】:作为其使用的另一个例子:
如果您有一个 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;" src="/mylink/image" /></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 小部件的网站显示。
这使我们能够指定包含图像的高度和位置、正确格式化作者姓名和日期等等,而无需新的小部件。这也意味着我可以编写脚本,而不必手动添加它们。
【讨论】:
【参考方案7】:来自***:
[在] XML 文档或外部解析实体中,CDATA 部分是 标记为供解析器解释的元素内容部分 仅作为字符数据,而不是标记。
http://en.wikipedia.org/wiki/CDATA
因此:解析器可以看到 CDATA 中的文本,但只能作为字符而不是 XML 节点。
【讨论】:
【参考方案8】:CDATA 代表字符数据。您可以使用它来转义一些否则将被视为常规 XML 的字符。这里面的数据不会被解析。
例如,如果你想传递一个包含&
的URL,你可以使用CDATA 来做。否则,您将收到错误,因为它将被解析为常规 XML。
【讨论】:
【参考方案9】:它转义了一个不能像往常一样传递给 XML 的字符串:
例子:
字符串中包含“&”。
你不能:
<FL val="Company Name">Dolce & Gabbana</FL>
因此,您必须使用 CDATA:
<FL val="Company Name"> <![CDATA["Dolce & Gabbana"]]> </FL>
【讨论】:
【参考方案10】:它用于包含可能被视为 xml 的数据,因为它包含某些字符。
这样里面的数据会被显示,但不会被解释。
【讨论】:
【参考方案11】:Cdata 是您可能想要传递给 xml 解析器但仍不被解释为 xml 的数据。
例如:-您有一个封装了问题/答案对象的 xml。此类开放字段可以包含不严格属于基本数据类型或 xml 定义的自定义数据类型的任何数据。就像 --这是 xml 注释的正确标签吗? .-- 您可能需要按原样传递它,而不被 xml 解析器解释为另一个子元素。 Cdata 来救你了。通过声明为 Cdata,您是在告诉解析器不要将包装为 xml 的数据处理(尽管它可能看起来像一个)
【讨论】:
【参考方案12】:通常用于在 XML 文档中嵌入自定义数据,例如图片或声音数据。
【讨论】:
虽然您可以将文本编码的二进制数据放入 CDATA 部分,但您不必这样做,因为 CDATA 与二进制没有任何直接关系。【参考方案13】:注意CDATA
结构仅在将文本直接放入 XML 文本文件时才需要。
也就是说,如果手动输入或直接以编程方式构建 XML 文本,则只需使用 CDATA
。
使用 DOM 处理器 API 或 SimpleXML 输入的任何文本都将自动转义,以防止违反 XML 内容规则。
尽管如此,有时使用 CDATA
可以减少文本大小,否则会在所有实体编码时生成,例如 style
标签中的 css 或 script
标签中的 javascript,其中许多语言构造使用 HTML|XML 中的字符,例如 <
和 >
。
【讨论】:
以上是关于XML 中的 <![CDATA[]]> 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章