#PCDATA
DTD和#CDATA
in DTD和有什么不一样?
7 回答
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
(这将是完全合法的)。
PCDATA - 解析的字符数据
XML 解析器通常解析 XML 文档中的所有文本。
CDATA -(未解析的)字符数据
CDATA 一词用于表示不应由 XML 解析器解析的文本数据。
“<”和“&”之类的字符在 XML 元素中是非法的。
在 DTD 中,PCDATA 和 CDATA 分别用于断言元素和属性的允许内容。在元素的内容模型中,#PCDATA 表示该元素包含(可能包含)“任何旧文本”。(除了下面提到的例外情况。)在属性的声明中,CDATA 是一种可以放在属性允许值上的约束(其他类型,所有互斥,包括 ID、IDREF 和 NMTOKEN)。允许值为 CDATA 的属性(如元素中的 PCDATA)可以包含“任何旧文本”。
一个可能真正令人困惑的问题是还有另一个“CDATA”,也称为标记部分。标记部分是元素 (#PCDATA) 内容的一部分,用特殊字符串分隔:关闭它。如果您记得 PCDATA 是“已解析的字符数据”,那么 CDATA 部分实际上是相同的,没有“已解析”。解析器将标记部分的内容传输到下游应用程序,而不会在每次遇到特殊字符(如 < 和 &)时打嗝。当您编写包含大量这些特殊字符(如脚本和代码片段)的文档时,这很有用;它比相应的实体引用更容易输入数据,也更容易阅读。
因此,您可以推断“任何旧文本”规则的例外是 PCDATA 不能包含任何这些未转义的特殊字符,除非它们属于 CDATA 标记部分的范围。
PCDATA 和 CDATA 之间的主要区别是
PCDATA - 基本上用于 ELEMENTS 而
CDATA - 用于 XML 的属性,即 ATTLIST
CDATA(C字符数据):类似于评论,但它是文档的一部分。即 CDATA 是一个数据,它是文档的一部分,但数据不能用 XML 解析。
注意:解析 XML 时省略 XML 注释,但 CDATA 显示为原样。
PCDATA ( Parsed C character DATA ) :默认情况下,一切都是 PCDATA 。PCDATA 是一个数据,可以用 XML 解析。
个人电脑数据
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>