默认情况下,XML中的所有内容都是解析后的字符数据(#PCDATA),那么为什么我们需要在DTD中指定#PCDATA。有人请解释一下。感谢。
答案 0 :(得分:1)
我不确定您要问以下哪些问题。
问题1:在内容模型中使用enter code here
关键字有什么意义?
正如@mzjin已经指出的那样,在声明混合内容时会使用
关键字;为了允许声明区分可以包含字符数据的元素,需要它(或逻辑上等同于它的东西),例如enter code here
wget [hocking URI here]
enter code here
和包含其他元素的元素,可选地由无意义的空格分隔,但不是字符数据,如
#PCDATA
当你说“默认情况下,XML中的所有内容都是解析后的字符数据”,你的意思是什么?对于未在DTD中声明的元素,XML中没有定义“默认”声明。某些处理器可能会对未声明的元素采用该表单的声明,以便在读取无效文档时尝试继续运行,这可能很有用。但它不是由XML定义的规则。
问题2:当XML文档中的所有字符数据都通过解析器传递并因此必须“解析”时,为什么称为“已解析”字符数据?
继承自ISO 8879(定义SGML)的关键字#PCDATA
确实代表“已解析的字符数据”,但其外延比您想象的要窄。它表示将识别所有潜在分隔符的字符数据,包括
<!ELEMENT a (#PCDATA) >
<!ELEMENT p (#PCDATA | emph | term | list)* >
用于评论和CDATA部分(在SGML中,也用于条件部分)<!ELEMENT text (front?, body, back?) >
<!ELEMENT a (x | y | z)* >
用于开始标记和唯一标记PCDATA
用于结束标记<!
用于数字字符引用<
用于实体参考此属性将已解析字符数据(在技术意义上)与其他两种字符数据区分开来,由关键字</
(可替换字符数据)和&#
表示(只是字符数据),其中识别不同的分隔符集。 (RCDATA是SGML的一部分,但不是XML的一部分。)
例如,在CDATA标记的部分中,唯一识别的分隔符是标记部分&
的结尾。
在声明为CDATA的属性中,唯一识别的分隔符为RCDATA
,CDATA
,以及属性值规范的右引号(]]>
或&
)。
在SGML文档中,标记的部分可以使用关键字&#
;在其中,将识别实体引用("
,数字字符引用('
)和标记部分结束分隔符(RCDATA
),但不会识别开始和结束标记分隔符(如果我正在读8879,也没有标记部分打开分隔符&
)。
您可能会认为8879中选择的术语可能并不像它可能那样清晰,并且更清晰的术语可能是有用的和有用的。如果是这样,你就不会第一个这么说了。