89

#PCDATADTD和#CDATAin DTD和有什么不一样?

4

7 回答 7

81
  • 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、注释和 SGML 指令)被解析而不是显示为原始文本。这也意味着实体引用被替换。

另一种允许纯文本内容的内容模型是CDATA. 在 XML 中,元素内容模型可能不会隐式设置为CDATA,但在 SGML 中,这意味着在元素的内容中忽略了标记和实体引用。然而,在类型属性中CDATA,实体引用被替换。

在 XML 中,#PCDATA是唯一的纯文本内容模型。如果您想在元素中允许文本内容,您可以使用它。内容CDATA模型可以通过 中的CDATA块标记显式使用#PCDATA,但元素内容可能未按CDATA默认定义。

在 DTD 中,包含文本的属性的类型必须是CDATA. 属性声明中的关键字与 XML 文档中CDATA的部分具有不同的含义。CDATA在一个部分中,CDATA所有字符都是合法的(包括、、、<和字符) >,除了结束标记。&'"]]>

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

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

于 2012-07-24T05:19:39.490 回答
78

PCDATA - 解析的字符数据

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

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

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

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

于 2009-05-27T23:23:31.450 回答
14
于 2016-12-26T19:28:50.930 回答
12

从这里谷歌是你的朋友):

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

一个可能真正令人困惑的问题是还有另一个“CDATA”,也称为标记部分。标记部分是元素 (#PCDATA) 内容的一部分,用特殊字符串分隔:关闭它。如果您记得 PCDATA 是“已解析的字符数据”,那么 CDATA 部分实际上是相同的,没有“已解析”。解析器将标记部分的内容传输到下游应用程序,而不会在每次遇到特殊字符(如 < 和 &)时打嗝。当您编写包含大量这些特殊字符(如脚本和代码片段)的文档时,这很有用;它比相应的实体引用更容易输入数据,也更容易阅读。

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

于 2009-05-27T23:23:29.517 回答
3

PCDATA 和 CDATA 之间的主要区别是

PCDATA - 基本上用于 ELEMENTS 而

CDATA - 用于 XML 的属性,即 ATTLIST

于 2013-04-02T13:43:43.663 回答
0

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

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

于 2017-07-12T13:55:53.077 回答
0

个人电脑数据

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 的数据/文本,从而将employee 的值设为:

vimal jaiswal vimal@javatpoint.com

数据中心

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 示例中,在元素employee 之后使用 CDATA 使数据/文本不被解析,因此它将给出employee 的值:

<firstname>vimal</firstname><lastname>jaiswal</lastname><email>vimal@javatpoint.com</email>
于 2021-09-20T04:58:09.660 回答