【问题标题】:what actually is PCDATA and CDATA?PCDATA 和 CDATA 到底是什么?
【发布时间】:2010-10-25 20:46:15
【问题描述】:

PCDATA 和 CDATA 的定义似乎很松散

  1. PCDATA 是字符数据,但要被解析的。
  2. CDATA 是字符数据,不是要解析的。

但是后来有人告诉我 CDATA 实际上已解析或 PCDATA 实际上未解析...所以有点混乱。有谁知道真正的交易是什么?

更新:我实际上在 Wikipedia 上添加了 PCDATA 定义...所以不要太认真地回答这个答案,因为这只是我对它的粗略理解。

【问题讨论】:

  • 混淆可能是由于 CDATA 可以被解析,但由不同的解析器造成的。例如,script 元素的内容(HTML 中的 CDATA)确实会被 Javascript 解释器解析。

标签: html xml xhtml cdata pcdata


【解决方案1】:

来自维基:

PCDATA

简单来说,PCDATA 代表 Parsed Character Data。这意味着字符将由 XML、XHTML 或 HTML 解析器解析。 (&amp;lt; 将更改为 <p> 将被视为段落标签等)。与 CDATA 相比,CDATA 中的字符不会被 XML、XHTML 或 HTML 解析器解析。

CDATA

术语 CDATA 表示字符数据,在标记语言 SGML 和 XML 中用于不同但相关的目的。该术语表示文档的某个部分是一般字符数据,而不是非字符数据或具有更具体、有限结构的字符数据。

【讨论】:

    【解决方案2】:

    PCDATA 和 CDATA 都被解析。它们都是字符数据。

    它们都必须只包含有效字符。例如,如果您的文档编码为 UTF-8,则 CDATA 部分的内容仍必须是有效的 UTF-8 字符。所以随机二进制数据可能会阻止文档格式正确。如果只是为了找到结束部分标记,仍然会解析 CDATA 部分。但是其他类似标记的字符,如 和 & 会被解析器忽略并按原样传递。

    PCDATA 文字 &lt;&amp;(以及属性值中的 '")中的 OTOH 必须转义,否则它们将被解释为标记。实体也将被扩展。

    所以是的,CDATA 部分确实被解析了。我不知道为什么你被告知 PCDATA 没有被解析。

    【讨论】:

      【解决方案3】:

      PCDATA - 解析的字符数据

      CDATA -(未解析的)字符数据

      http://www.w3schools.com/XML/xml_cdata.asp

      【讨论】:

        【解决方案4】:
        • PCDATA 是将由解析器解析的文本。文本内的标签 将被视为标记,实体将被扩展。
        • CDATA 是不会被解析器解析的文本。文本内的标签将 被视为标记,实体不会被扩展。

        默认情况下,一切都是 PCDATA。在下面的例子中,忽略根,&lt;bar&gt; 将被解析,它没有内容,只有一个孩子。

        <?xml version="1.0"?>
        <foo>
        <bar><test>content!</test></bar>
        </foo>
        

        当我们要指定一个元素只包含文本,不包含子元素时,我们使用关键字PCDATA,因为这个关键字指定元素必须包含可解析的字符数据——即除字符less之外的任何文本——比 () 、和号 (&)、引号 (') 和双引号 (")。

        在下一个示例中,bar 是 CDATA,未经解析,内容为 "&lt;test&gt;content!&lt;/test&gt;"

        <?xml version="1.0"?>
        <foo>
        <bar><![CDATA[<test>content!</test>]]></bar>
        </foo>
        

        SGML 中有多种内容模型。 #PCDATA 内容模型表示元素可能包含纯文本。它的“已解析”部分意味着其中的标记(包括 PI、cmets 和 SGML 指令)被解析而不是显示为原始文本。这也意味着实体引用被替换。

        另一种允许纯文本内容的内容模型是 CDATA。在 XML 中,元素内容模型可能不会隐式设置为 CDATA,但在 SGML 中,这意味着在元素的内容中忽略了标记和实体引用。然而,在 CDATA 类型的属性中,实体引用被替换。

        在 XML 中,#PCDATA 是唯一的纯文本内容模型。如果您想在元素中允许文本内容,您可以使用它。 CDATA 内容模型可以通过#PCDATA 中的 CDATA 块标记显式使用,但默认情况下元素内容可能不会定义为 CDATA。

        在 DTD 中,包含文本的属性类型必须是 CDATA。属性声明中的 CDATA 关键字与 XML 文档中的 CDATA 部分具有不同的含义。在 CDATA 部分中,所有字符都是合法的(包括 、&、' 和“字符),除了“]]>”结束标记。

        #PCDATA 不适用于属性的类型。它用于“叶子”文本的类型。

        仅出于历史原因,#PCDATA 前面带有一个哈希(也称为“哈希标签”或 octothorp)。

        【讨论】:

          【解决方案5】:

          你的第一个定义是正确的。

          PCDATA 被解析,这意味着实体被扩展并且文本被视为标记。 XML 解析器不解析 CDATA。

          【讨论】:

            【解决方案6】:

            如果在 XHTML DTD 中默认情况下仅将元素设置为 CDATA,它将节省很多丑陋的手动覆盖... 为什么脚本块会包含其他元素?如果有这样的元素,它们会在 DOM 操作动作中由 JS 解释器处理——在这种情况下,XML 解析器在插入和呈现文档之前仍应完全忽略它们。我想它可能是为了强制使用外部脚本资源文件而设计的,这最终是一件好事。

            【讨论】:

              猜你喜欢
              • 2011-04-18
              • 2010-10-29
              • 2013-12-26
              • 1970-01-01
              • 2015-09-16
              • 2016-02-13
              • 2012-07-03
              • 2021-06-23
              • 1970-01-01
              相关资源
              最近更新 更多