DTD中PCDATA和CDATA之间的区别


86

是什么区别#PCDATA,并#CDATADTD



XML DTD中使用的关键字名称为#PCDATACDATA。没有PCDATA关键字,也没有 #CDATA
mzjn

1
除了可接受的答案,您还应该阅读stackoverflow.com/a/918462/2013911,因为它解释了CDATA属性类型和<![CDATA []]>标记的部分之间的区别。
尼克拉斯·彼得

Answers:


75

PCDATA-解析的字符数据

XML解析器通常解析XML文档中的所有文本。

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

术语CDATA用于不应该由XML解析器解析的文本数据。

XML元素中的字符“ <”和“&”是非法的。


77
  • 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中,包含文本的属性的类型必须为CDATACDATA属性声明中的关键字CDATA与XML文档中的部分具有不同的含义。在一个CDATA部分中的所有字符是合法的(包括<>&'"字符),除了]]>结束标记。

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

#PCDATA在内容模型中以哈希开头,以区分此关键字与命名元素PCDATA(这是完全合法的)。


6
很好的答案,除了最后一句话。#不是主题标签。只有在此符号前面的标签是#标签。该符号本身有许多名称,包括“数字符号”,“英镑符号”(主要是加拿大和美国),或仅是“哈希”(因此称为“ hashtag”)。

6
#justhadtogetthatoffmychest

3
我不同意前面的##PCDATA是出于历史原因。这样做是因为在DTD中,元素还可能包含名为的元素PCDATA,该元素必须是可能的,并且看起来像<!ELEMENT foo (PCDATA)>
MathiasMüller'16

引用和双引号在PCDATA内容中完全合法。和号可能会出现,但(在XML中)仅作为实体介绍器。
Toby Speight

12

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>


11

在这里Google是您的朋友):

在DTD中,PCDATA和CDATA分别用于断言有关元素和属性的允许内容。在元素的内容模型中,#PCDATA表示该元素包含(可能包含)“任何旧文本”。(如下所述除外。)在属性的声明中,CDATA是一种可以施加在属性的允许值上的约束(其他类型,所有这些互斥,包括ID,IDREF和NMTOKEN)。允许值为CDATA的属性可以(例如元素中的PCDATA)包含“任何旧文本”。

一个潜在的真正令人困惑的问题是,还有另一个“ CDATA”,也称为标记部分。带标记的部分是元素(#PCDATA)内容的一部分,用特殊字符串定界:将其关闭。如果您还记得PCDATA是“解析的字符数据”,那么CDATA节实际上就是同一件事,没有“解析的”。解析器将标记部分的内容传输到下游应用程序,而不会在每次遇到特殊字符(如<和&)时打h。当您编码包含许多特殊字符(例如脚本和代码片段)的文档时,这很有用;与相应的实体引用相比,它在数据输入和读取方面更容易。

因此,可以推断出“任何旧文本”规则的例外是PCDATA不能包含任何这些未转义的特殊字符,除非它们属于CDATA标记部分的范围。


3

PCDATA和CDATA之间最主要的区别是

PCDATA-主要用于ELEMENTS,而

CDATA-用于XML的属性,即ATTLIST


0

CDATA(ç haracter DATA):这是类似评论,但它是文档的一部分。也就是说,CDATA是数据,它是文档的一部分,但是不能用XML解析数据。
注意:解析XML时,省略XML注释,但CDATA照原样显示。

PCDATA(P arsed ç haracter DATA):默认情况下,一切都是PCDATA。PCDATA是数据,可以将其解析为XML。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.