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">