是什么区别#PCDATA,并#CDATA在DTD?
#PCDATA和CDATA。没有PCDATA关键字,也没有  #CDATA。
                是什么区别#PCDATA,并#CDATA在DTD?
#PCDATA和CDATA。没有PCDATA关键字,也没有  #CDATA。
                Answers:
PCDATA-解析的字符数据
XML解析器通常解析XML文档中的所有文本。
CDATA-(未解析的)字符数据
术语CDATA用于不应该由XML解析器解析的文本数据。
XML元素中的字符“ <”和“&”是非法的。
PCDATA是将由解析器解析的文本。文本内的标签将被视为标记,并且实体将被扩展。CDATA是不会被解析器解析的文本。文本内的标签
不会被视为标记,并且实体也不会扩展。默认情况下,所有内容均为PCDATA。在下面的示例中,将忽略根,<bar>将对其进行分析,并且它将没有内容,只有一个孩子。
<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>
当我们要指定一个元素仅包含文本而没有任何子元素时,我们使用关键字PCDATA,因为此关键字指定该元素必须包含可分析的字符数据–即,除小于字符(<)以外的任何文本,大于(>),&符(&),quote(')和双引号(")。
在下一个示例中,<bar>包含CDATA。它的内容将不会被解析,因此将被解析<test>content!</test>。
<?xml version="1.0"?>
<foo>
<bar><![CDATA[<test>content!</test>]]></bar>
</foo>
SGML中有几种内容模型。该#PCDATA内容模型说,一个元素可以包含纯文本。它的“已解析”部分意味着将解析其中的标记(包括PI,注释和SGML指令),而不是将其显示为原始文本。这也意味着实体引用将被替换。
允许纯文本内容的另一种内容模型是CDATA。在XML中,可能不会将元素内容模型隐式设置为CDATA,但是在SGML中,这意味着在元素的内容中会忽略标记和实体引用。在属性中CDATA但是,类型的,实体引用将被替换。
在XML中,#PCDATA是唯一的纯文本内容模型。如果您根本想允许元素中的文本内容,则可以使用它。的CDATA内容模型可以明确地通过使用CDATA在块标记#PCDATA,但元件的内容可能不被定义为CDATA每默认。
在DTD中,包含文本的属性的类型必须为CDATA。CDATA属性声明中的关键字CDATA与XML文档中的部分具有不同的含义。在一个CDATA部分中的所有字符是合法的(包括<,>,&,'和"字符),除了]]>结束标记。
#PCDATA不适合属性的类型。它用于“叶子”文本的类型。
#PCDATA在内容模型中以哈希开头,以区分此关键字与命名元素PCDATA(这是完全合法的)。
#不是主题标签。只有在此符号前面的标签是#标签。该符号本身有许多名称,包括“数字符号”,“英镑符号”(主要是加拿大和美国),或仅是“哈希”(因此称为“ hashtag”)。
                    #PCDATA是出于历史原因。这样做是因为在DTD中,元素还可能包含名为的元素PCDATA,该元素必须是可能的,并且看起来像<!ELEMENT foo (PCDATA)>。
                    PCDATA –解析的字符数据。它解析XML文档中的所有数据。
例:
<family>
    <mother>mom</mother>
    <father>dad</father>
</family>
在这里,该<family>元素还包含2个元素:<mother>和<father>。因此,它进一步解析以获取父母和母亲的文字,从而赋予家庭以“妈妈爸爸”的文字价值。
CDATA –未解析的字符数据。这是不应在xml文档中进一步解析的数据。
<family>
    <![CDATA[ 
       <mother>mom</mother>
       <father>dad</father>
    ]]>
</family>
在这里,family的文本值为<mother>mom</mother><father>dad</father>。
在DTD中,PCDATA和CDATA分别用于断言有关元素和属性的允许内容。在元素的内容模型中,#PCDATA表示该元素包含(可能包含)“任何旧文本”。(如下所述除外。)在属性的声明中,CDATA是一种可以施加在属性的允许值上的约束(其他类型,所有这些互斥,包括ID,IDREF和NMTOKEN)。允许值为CDATA的属性可以(例如元素中的PCDATA)包含“任何旧文本”。
一个潜在的真正令人困惑的问题是,还有另一个“ CDATA”,也称为标记部分。带标记的部分是元素(#PCDATA)内容的一部分,用特殊字符串定界:将其关闭。如果您还记得PCDATA是“解析的字符数据”,那么CDATA节实际上就是同一件事,没有“解析的”。解析器将标记部分的内容传输到下游应用程序,而不会在每次遇到特殊字符(如<和&)时打h。当您编码包含许多特殊字符(例如脚本和代码片段)的文档时,这很有用;与相应的实体引用相比,它在数据输入和读取方面更容易。
因此,可以推断出“任何旧文本”规则的例外是PCDATA不能包含任何这些未转义的特殊字符,除非它们属于CDATA标记部分的范围。