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

<![CDATA[some stuff]]>

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

但有时用,有时不用。我假设这是为了标记一些东西是“数据”,将被插入之后。但是什么是数据呢?我用XML标记写的东西不是某种数据吗?


当前回答

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

例子:

字符串中包含“&”。

你不能:

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

因此,您必须使用CDATA:

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

其他回答

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

注意,只有在直接将文本放入XML文本文件时才需要CDATA结构。

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

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

尽管如此,有时使用CDATA可以减少原本由所有实体编码产生的文本大小,例如样式标记中的css或脚本标记中的javascript,其中许多语言构造使用HTML|XML中的字符,如<和>。

它用于包含可能被视为xml的数据,因为它包含某些字符。

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

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

Say for eg :- You have an xml which has encapsulates question/answer object . Such open fields can have any data which does not strictly fall under basic data type or xml defined custom data types. Like --Is this a correct tag for xml comment ? .-- You may have a requirement to pass it as it is without being interpreted by the xml parser as another child element. Here Cdata comes to your rescue . By declaring as Cdata you are telling the parser don't treat the data wrapped as an xml (though it may look like one )

一个大的用例:你的xml包含一个程序,作为数据(例如Java的网页教程)。在这种情况下,您的数据包含大量字符,其中包括'&'和'<',但这些字符并不是xml字符。

比较:

<example-code>
while (x &lt; len &amp;&amp; !done) {
    print( &quot;Still working, &apos;zzz&apos;.&quot; );
    ++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.

(我怀疑所有与评论的比较都有点误导/没有帮助。)