20.5.2 DTD的结构

DTD的结构包括元素类型的声明、属性表的声明、记号的声明。下面将逐一介绍。

1.元素类型的声明

元素类型的声明定义元素的名称和元素的内容,定义文档中允许什么元素和不允许什么元素、元素出现的次序。如果没有明确允许,那就是禁止。元素类型声明的语法如下所示:


<!ELEMENT元素(元素内容说明)>


其中元素内容说明有五种形式,分别是EMPTY、ANY、混合内容、#PCDATA、元素内容。下面将分别讲述它们的使用场所。

❑EMPTY:空元素的内容。

❑ANY:任意元素的内容。

❑混合内容:可以出现字符数据,子元素或者两者的混合体。

❑#PCDATA:只能出现字符数据。

❑元素内容:只能出现子元素,不能直接出现字符数据。

(1)#PCDATA的内容

只有字符数据才能作为元素的内容,其声明语法:


<!ELEMENT元素名(#PCDATA)>


【实例20.6】下面是一个有关它的实例。


01<?xml version="1.0"encoding="gb2312"standalone="yes"?>

02<!Docutype就业信息[<!ELEMENT就业信息(#PCDATA)>]>

03<就业信息>

04暂无信息

05</就业信息>


如果上面的实例修改如下就是错误的。


01<?xml version="1.0"encoding="gb2312"standalone="yes"?>

02<!Docutype就业信息[<!ELEMENT就业信息(#PCDATA)>]>

03<就业信息>

04 <公司名称>

05 暂无信息

06 </公司名称>

07</就业信息>


(2)元素内容

在元素内部只能出现指定子元素,不允许出现字符或混合内容。看一个实例,代码如下。


<!ELEMENT就业信息(公司名,公司简介,公司地址,邮编,电话,传真,E-MAIL,联系人,招聘职位*)>


分析:在实例的最后有一个“*”,这个符号代表什么呢?

❑“*”:代表元素可以出现零次或多次。

❑“+”:代表元素可以出现一次或多次。

❑“?”:代表可以出现零次或一次。

没有任何标识符的元素只能出现一次。下面再举一个有关元素内容的实例。


<!ELEMENT招聘职位(职位名,月薪?,招聘人数,招聘要求*,工作地点,发布日期,负责人+)>


分析:职位名只出现一次,招聘要求可出现零次或多次,月薪可出现零次或一次,负责人必然出现一次以上,招聘人数只出现一次。

(3)EMPTY内容

常包含一些非字符数据,如图像数据、音乐数据等。其声明语法如下:


<!ELEMENT元素名EMPTY>


(4)ANY内容

所有可能的元素以及可析字符数据,都可以是所声明的元素的内容。


<!ELEMENT元素名ANY>


(5)混合内容

元素既可以含有可析字符数据,也可以含有标记文本。其声明语法如下:


<!ELEMENT元素名(#PCDATA|子元素1|子元素2|子元素3)>


2.属性表的声明

属性由“=”分隔开的属性名值对构成,它只能出现在元素标记的内部,其包含了有关元素的信息。属性表的声明语法如下:


<!ATTLIST对应的元素名属性名属性取值类型 属性默认值>


在XML文档中:


<月薪 货币单位="人民币">6000</月薪>


对应的DTD文档中:


<!ELEMENT月薪(#PCDATA)>

<!ATTLIST月薪货币单位CDATA"人民币">


(1)属性的取值类型

下面将学习属性取值类型。属性取值类型有很多种,如下所示:

CDATA:可以解析的字符数据。

Enumerated:枚举型,取值必须从中选出。

ENTITY:在DTD中声明的实体。

ENTITIES:在DTD中声明的若干个实体。

ID:取值在文档中必须是唯一的。

IDREF:文档中某个元素的ID属性值。

NMTOKEN:任意不含空格的XML名称。

NMTOKENS:由空格分开的多个XML名称。

NOTATION:在DTD中声明的记号名。

(2)默认声明

默认声明可以有四种默认设置:

REQUIRED:说明必须为元素提供该属性。

IMPLIED:说明元素可以包含该属性,也可以不包含该属性。

FIXED+默认值:说明一个固定的属性默认值,文档的编写者不能修改该属性的值。

默认值:同上一种几乎差不多。只不过该属性值可以改变。

3.记号的声明

所谓记号声明,就是用记号标识非XML格式数据,应用程序就利用记号来识别和处理数据,记号用于描述非XML格式的数据。在DTD中,NOTATION声明为特殊的数据类型制作记号。记号声明的语法:


<!NOTATION记号名 SYSTEM"外部标识">


例如:

<!NOTATION TIFF SYSTEM"Image/tiff">