-
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 的元素区分开来(这是完全合法的)。