是什么区别#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标记部分的范围。