XML中的<![CDATA []]>是什么意思?

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

<![CDATA[some stuff]]>

我发现这个CDATA标签总是在开头,然后是一些东西。

但有时它被使用,有时不是。 我认为这是为了标记some stuff是在那之后插入的“数据”。 但是什么样的数据是some stuff ? 我写的东西不是用XML标记某种数据吗?


CDATA代表字符数据,它表示这些字符串之间的数据包含可以解释为XML标记的数据,但不应该是。

CDATA和评论之间的主要区别是:

  • 正如理查德指出的那样,CDATA仍然是该文件的一部分,而评论则不是。
  • 在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>
    

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

    <example-code><![CDATA[
    while (x < len && !done) {
        print( "Still working, 'zzzz'." );
        ++x;
        }
    ]]></example-code>
    

    特别是如果您从文件(或包括它,在预处理器中)复制/粘贴此代码,则只需在xml文件中包含所需的字符,而不用将它们与XML标记/属性混淆即可。 正如@paary提到的,其他常见用途包括嵌入包含&符号的URL。 最后,即使数据只包含一些特殊字符,但数据非常长(例如,章节的内容),在编辑XML文件时不必对这些少数实体进行en / de-coding 。

    (我怀疑所有的评论比较有点误导/无益。)

    链接地址: http://www.djcxy.com/p/27555.html

    上一篇: What does <![CDATA[]]> in XML mean?

    下一篇: How to define multiple CSS attributes in JQuery?