我经常在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 < 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 文件时不必对这几个实体进行编码 / 编码很好。
(我怀疑所有与评论的比较都有点误导 / 无益。)