DTD中PCDATA和CDATA的区别

Posted

技术标签:

【中文标题】DTD中PCDATA和CDATA的区别【英文标题】:Difference between PCDATA and CDATA in DTD 【发布时间】:2010-10-29 10:35:03 【问题描述】:

DTD#PCDATA#CDATA有什么区别?

【问题讨论】:

what actually is PCDATA and CDATA? 的可能重复项 XML DTD 中使用的关键字名称为#PCDATACDATA。没有PCDATA 关键字,也没有#CDATA 除了接受的答案之外,您还应该阅读***.com/a/918462/2013911,因为它解释了 CDATA 属性类型和 标记部分之间的区别。 【参考方案1】:

个人电脑数据

PCDATA:(已解析字符数据):XML 解析器用于解析 XML 文档中的所有文本。 PCDATA 代表已解析字符数据。 PCDATA 是将由解析器解析的文本。 PCDATA 中的标签将被视为标记,实体将被展开。

换句话说,您可以说解析的字符数据意味着 XML 解析器检查数据并确保它不包含将被替换的实体。

举个例子:

<?xml version="1.0"?>  
<!DOCTYPE employee SYSTEM "employee.dtd">  
<employee>  
  <firstname>vimal</firstname>  
  <lastname>jaiswal</lastname>  
  <email>vimal@javatpoint.com</email>  
</employee>   

在上面的示例中,employee 元素包含另外 3 个元素 'firstname'、'lastname' 和 'email',因此它会进一步解析以获取 firstname、lastname 和 email 的数据/文本以给出员工的值如:

vimal jaiswal vimal@javatpoint.com

CDATA

CDATA:(未解析的字符数据):CDATA 包含在 XML 文档中未进一步解析的文本。 CDATA 文本中的标签不被视为标记,实体不会被展开。

我们以 CDATA 为例:

<?xml version="1.0"?>  
<!DOCTYPE employee SYSTEM "employee.dtd">  
<employee>  
<![CDATA[  
  <firstname>vimal</firstname> 
  <lastname>jaiswal</lastname> 
  <email>vimal@javatpoint.com</email> 
]]>   
</employee>   

在上面的 CDATA 示例中,CDATA 紧跟在元素employee 之后,使数据/文本不被解析,因此它会给出employee 的值:

<firstname>vimal</firstname><lastname>jaiswal</lastname><email>vimal@javatpoint.com</email>

【讨论】:

【参考方案2】:

PCDATA – 已解析的字符数据。它解析 XML 文档中的所有数据。

例子:

<family>
    <mother>mom</mother>
    <father>dad</father>
</family>

这里,&lt;family&gt; 元素包含另外 2 个元素:&lt;mother&gt;&lt;father&gt;。因此它进一步解析得到母亲和父亲的文本,将家庭的文本值赋予为“妈妈爸爸”

CDATA – 未解析的字符数据。这是不应在 xml 文档中进一步解析的数据。

<family>
    <![CDATA[ 
       <mother>mom</mother>
       <father>dad</father>
    ]]>
</family>

这里family的文本值为&lt;mother&gt;mom&lt;/mother&gt;&lt;father&gt;dad&lt;/father&gt;

【讨论】:

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

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

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

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

在下一个示例中,&lt;bar&gt; 包含 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 部分中,所有字符都是合法的(包括&lt;&gt;&amp;'" 字符),]]&gt; 结束标记除外。

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

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

【讨论】:

很好的答案,除了最后一句话。 # 不是主题标签。只有此符号前面的标签才是主题标签。符号本身有many names,包括“数字符号”、“井号”(主要是加拿大和美国)或只是“哈希”(因此得名“哈希标签”)。 #justhadtogetthatoffmychest 我不同意#PCDATA前面的#是出于历史原因。它存在是因为在 DTD 中,一个元素还可以包含一个名为 PCDATA 的元素,这一定是可能的,并且看起来像 &lt;!ELEMENT foo (PCDATA)&gt; 引号和双引号在 PCDATA 内容中是完全合法的。和符号可能会出现,但(在 XML 中)仅作为实体介绍者。【参考方案4】:

CDATA(C字符DATA):类似于注释,但它是文档的一部分。即CDATA是一个数据,它是文档的一部分,但是不能用XML解析数据。注意:解析XML时省略XML注释,但CDATA显示为原样。

PCDATA (Parsed C字符 DATA) :默认情况下,一切都是 PCDATA。 PCDATA是一个数据,可以用XML解析。

【讨论】:

【参考方案5】:

PCDATA - 解析的字符数据

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

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

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

像“

【讨论】:

【参考方案6】:

PCDATA 和 CDATA 的主要区别是

PCDATA - 基本上用于 ELEMENTS 而

CDATA - 用于 XML 的属性,即 ATTLIST

【讨论】:

【参考方案7】:

From here(Google is your friend):

在 DTD 中,PCDATA 和 CDATA 用于 断言一些关于允许的东西 元素和属性的内容, 分别。在元素的内容中 模型,#PCDATA 表示该元素 包含(可能包含)“任何旧文本”。 (除了下面提到的例外情况。)在 一个属性的声明,CDATA 是 您可以施加的一种约束 属性的允许值 (其他种类,都是互斥的, 包括 ID、IDREF 和 NMTOKEN)。一个 允许值为的属性 CDATA 可以(就像一个元素中的 PCDATA) 包含“任何旧文本”。

一个可能非常令人困惑的问题 是否还有另一个“CDATA” 也称为标记部分。一种 标记部分是元素的一部分 (#PCDATA) 内容以 特殊字符串:关闭它。如果你 请记住,PCDATA 是“已解析 字符数据,”一个 CDATA 部分是 字面上相同的东西,没有 “解析。”解析器传输内容 标记部分到下游 应用程序没有打嗝每 他们遇到特殊字符的时间 像

所以你可以推断出异常 “任何旧文本”规则是 PCDATA 不能包括任何这些未转义的 特殊字符,除非他们掉下来 在标记的 CDATA 范围内 部分。

【讨论】:

以上是关于DTD中PCDATA和CDATA的区别的主要内容,如果未能解决你的问题,请参考以下文章

区分XML中CDATA和#PCDATA

PCDATA 和 CDATA 到底是啥?

DTD约束

DTD约束

xml约束之dtd

DTD与XML Schema