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 中使用的关键字名称为#PCDATA
和CDATA
。没有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>
这里,<family>
元素包含另外 2 个元素:<mother>
和 <father>
。因此它进一步解析得到母亲和父亲的文本,将家庭的文本值赋予为“妈妈爸爸”
CDATA – 未解析的字符数据。这是不应在 xml 文档中进一步解析的数据。
<family>
<![CDATA[
<mother>mom</mother>
<father>dad</father>
]]>
</family>
这里family的文本值为<mother>mom</mother><father>dad</father>
。
【讨论】:
【参考方案3】:PCDATA
是将由解析器解析的文本。文本内的标签
将被视为标记,实体将被扩展。
CDATA
是解析器不会解析的文本。文本内的标签将
不被视为标记,实体不会被扩展。
默认情况下,一切都是PCDATA
。在下面的例子中,忽略根,<bar>
将被解析,它没有内容,只有一个孩子。
<?xml version="1.0"?>
<foo>
<bar><test>content!</test></bar>
</foo>
当我们要指定一个元素只包含文本,不包含子元素时,我们使用关键字PCDATA
,因为这个关键字指定元素必须包含可解析的字符数据——即除字符之外的任何文本小于 (<
) 、大于 (>
) 、与号 (&
)、引号 ('
) 和双引号 ("
)。
在下一个示例中,<bar>
包含 CDATA
。它的内容不会被解析,因此是<test>content!</test>
。
<?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
在内容模型中以散列开头,以将此关键字与名为 PCDATA
的元素区分开来(这是完全合法的)。
【讨论】:
很好的答案,除了最后一句话。#
不是主题标签。只有此符号前面的标签才是主题标签。符号本身有many names,包括“数字符号”、“井号”(主要是加拿大和美国)或只是“哈希”(因此得名“哈希标签”)。
#justhadtogetthatoffmychest
我不同意#PCDATA
前面的#是出于历史原因。它存在是因为在 DTD 中,一个元素还可以包含一个名为 PCDATA
的元素,这一定是可能的,并且看起来像 <!ELEMENT foo (PCDATA)>
。
引号和双引号在 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的区别的主要内容,如果未能解决你的问题,请参考以下文章