我经常CDATA
在XML
文件中找到这个奇怪的标签:
<![CDATA[some stuff]]>
我观察到,此CDATA
标签始终位于开头,然后再添加一些内容。
但有时会使用,有时却不会。我假设这是要标记的some stuff
是将在此之后插入的“数据”。但是什么样的数据some stuff
呢?我用XML标签写的东西不是某种数据吗?
我经常CDATA
在XML
文件中找到这个奇怪的标签:
<![CDATA[some stuff]]>
我观察到,此CDATA
标签始终位于开头,然后再添加一些内容。
但有时会使用,有时却不会。我假设这是要标记的some stuff
是将在此之后插入的“数据”。但是什么样的数据some stuff
呢?我用XML标签写的东西不是某种数据吗?
Answers:
CDATA代表字符数据,这意味着,在这些字符串之间的数据包括数据可能被解释为XML标记,但不应该是。
CDATA和注释之间的主要区别是:
]]>
(CDEnd
),而在注释中--
则是无效的。这意味着从一个格式正确的文档中给出以下四个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>
if (a[b[c]]>10) { }
。
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 < 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文件时不必对这几个实体进行编码/解码也很不错。 。
(我怀疑所有对评论的比较都具有误导性/无益。)
当我的xml元素需要存储HTML代码时,我曾经不得不使用CDATA。就像是
<codearea>
<![CDATA[
<div> <p> my para </p> </div>
]]>
</codearea>
因此,CDATA意味着它将忽略任何可以解释为XML标记的字符,例如<和>等。
从维基百科:
在XML文档或外部解析的实体中,CDATA部分是元素内容的一部分,标记为解析器仅解释为字符数据而不是标记。
因此:解析器可以看到CDATA中的文本,但只能将其视为字符,而不能将其视为XML节点。
作为其用法的另一个示例:
如果您具有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窗口小部件的网站显示,对此我们没有实际的格式设置控件。
这使我们能够指定所包含图像的高度和位置,正确设置作者姓名和日期格式,等等,而无需新的小部件。这也意味着我可以编写脚本,而不必手动添加它们。