在XML中使用PCDATA有什么用?

时间:2015-11-12 04:34:32

标签: xml dtd cdata pcdata

默认情况下,XML中的所有内容都是解析后的字符数据(#PCDATA),那么为什么我们需要在DTD中指定#PCDATA。有人请解释一下。感谢。

1 个答案:

答案 0 :(得分:1)

我不确定您要问以下哪些问题。

问题1:在内容模型中使用enter code here关键字有什么意义?

正如@mzjin已经指出的那样,在声明混合内容时会使用 enter code herewget [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的属性中,唯一识别的分隔符为RCDATACDATA,以及属性值规范的右引号(]]>& )。

在SGML文档中,标记的部分可以使用关键字&#;在其中,将识别实体引用(",数字字符引用(')和标记部分结束分隔符(RCDATA),但不会识别开始和结束标记分隔符(如果我正在读8879,也没有标记部分打开分隔符&)。

您可能会认为8879中选择的术语可能并不像它可能那样清晰,并且更清晰的术语可能是有用的和有用的。如果是这样,你就不会第一个这么说了。