我经常在XML文件中发现这个奇怪的CDATA标签:
<![CDATA[some stuff]]>
我观察到这个CDATA标记总是出现在开头,然后跟着一些东西。
但有时用,有时不用。我假设这是为了标记一些东西是“数据”,将被插入之后。但是什么是数据呢?我用XML标记写的东西不是某种数据吗?
我经常在XML文件中发现这个奇怪的CDATA标签:
<![CDATA[some stuff]]>
我观察到这个CDATA标记总是出现在开头,然后跟着一些东西。
但有时用,有时不用。我假设这是为了标记一些东西是“数据”,将被插入之后。但是什么是数据呢?我用XML标记写的东西不是某种数据吗?
当前回答
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文档中嵌入自定义数据,如图片或声音数据。
它用于包含可能被视为xml的数据,因为它包含某些字符。
这样,里面的数据将被显示,但不会被解释。
其中包含的数据不会被解析为XML,因此不需要是有效的XML,或者可以包含看似XML但实际上不是的元素。
从维基百科:
在XML文档或外部解析实体中,CDATA节是一个 元素内容的一部分,标记为供解析器解释 仅作为字符数据,而不是标记。 http://en.wikipedia.org/wiki/CDATA
因此:CDATA中的文本被解析器视为字符,而不是XML节点。
一个大的用例:你的xml包含一个程序,作为数据(例如Java的网页教程)。在这种情况下,您的数据包含大量字符,其中包括'&'和'<',但这些字符并不是xml字符。
比较:
<example-code>
while (x < len && !done) {
print( "Still working, 'zzz'." );
++x;
}
</example-code>
with
<example-code><![CDATA[
while (x < len && !done) {
print( "Still working, 'zzzz'." );
++x;
}
]]></example-code>
Especially if you are copy/pasting this code from a file (or including it, in a pre-processor), it's nice to just have the characters you want in your xml file, w/o confusing them with XML tags/attributes. As @paary mentioned, other common uses include when you're embedding URLs that contain ampersands. Finally, even if the data only contains a few special characters but the data is very very long (the text of a chapter, say), it's nice to not have to be en/de-coding those few entities as you edit your xml file.
(我怀疑所有与评论的比较都有点误导/没有帮助。)