DTD(文档类型定义)可以定义合法的XML文档结构,它使用一系列合法元素来定义文档的结构。DTD分为内部DTD和外部DTD,所谓内部DTD是指该DTD在某个文档的内部,只被该文档使用。外部DTD是指该DTD不在文档内部,可以被其他所有的文档来共享。DTD文档与XML文档实例的关系可以看成是类和对象的关系。

(1)外部DTD文件的编写及引用

新建一个外部family.dtd文件

<!ELEMENTfamily(father,mother,son+)><!ELEMENTfather(name,age)><!ELEMENTname(#PCDATA)><!ELEMENTage(#PCDATA)><!ELEMENTmother(name,age)><!ELEMENTson(name|wife|grandson)*><!ELEMENTwife(#PCDATA|name)*><!ELEMENTgrandson(name)><!ATTLISTsonstatusCDATA#REQUIRED>

编写XML文件引用DTD文件family.dtd

<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEfamilySYSTEM"file:///E:/Users/小爱爱/Desktop/family.dtd"><family><father><name>张三</name><age>40</age></father><mother><name>刘丽</name><age>36</age></mother><sonstatus="bigson"><name>张天</name><wife><name>王华</name></wife><grandson><name>张晓华</name></grandson></son><sonstatus="smallson"><name>张帅</name></son></family>

(2)内部DTD文件

新建一个内部有DTD文件的XML文件class.xml

<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEclass[<!ELEMENTclass(student*)><!ELEMENTstudent(name,age,sex)><!ELEMENTname(#PCDATA)><!ELEMENTage(#PCDATA)><!ELEMENTsex(#PCDATA)><!ATTLISTclassclassIdID#REQUIRED><!ATTLISTstudentstuIdIDREF#IMPLIED>]><classclassId="a01"><studentstuId="a01"><name>张三</name><age>18</age><sex>男</sex></student><studentstuId="a01"><name>李四</name><age>18</age><sex>女</sex></student><student><name>王五</name><age>17</age><sex>女</sex></student></class>

由以上的XML文件可以看出

#IMPLIED:表示该属性可以有也可以没有。

#REQUIRED:表示该属性必须有。

还有一种属性的特征

#FIXED:表示该属性的属性值固定。

被声明为IDREF属性类型的属性值必须引用ID属性类型的属性值。

(3)ANY的用法规则

<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEcompany[<!ELEMENTcompanyANY><!ELEMENTworker(name,sex,age)><!ELEMENTname(#PCDATA)><!ELEMENTsex(#PCDATA)><!ELEMENTage(#PCDATA)><!ATTLISTworkerworkIdID#REQUIRED>]><company><workerworkId="a10"><name>zhangsan</name><sex>nv</sex><age>28</age></worker><company></company><name>lisi</name><age>30</age><name>wangwu</name><sex>nan</sex></company>

ANY类型表示可以包含多个子元素且不受限制,也可包含字符串数据。但ANY一般用在对根元素的声明中。

(4)NMTOKEN和NMTOKENS

<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEstudent[<!ELEMENTstudent(#PCDATA)><!ATTLISTstudentstuIdNMTOKEN#REQUIRED><!ATTLISTstudentclassIdNMTOKENS#REQUIRED>]><studentstuId="a10"classId="a10"></student>

以上代码可以通过编译,当XML为以下代码时会出现下图的错误信息

<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEstudent[<!ELEMENTstudent(#PCDATA)><!ATTLISTstudentstuIdNMTOKEN#REQUIRED><!ATTLISTstudentclassIdNMTOKENS#REQUIRED>]><studentstuId="a10"classId="a10"></student>

NMTOKEN类型要求属性值中不能包含空格且必须以下划线、数字或字母开头。

NMTOKENS类型与NMTOKEN类型类似,NMTOKENS类型要求属性值必须以下划线、数字或字母开头。但可以包含空格。

(5)枚举类型

<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEpeople[<!ELEMENTpeople(person+)><!ELEMENTperson(#PCDATA)><!ATTLISTperson性别(男|女)#IMPLIED><!ATTLISTperson学历(高中|大学|研究生|博士)#IMPLIED>]><people><person性别="女"学历="大学">lily</person><person></person></people>

列举出要选的项,与下拉列表类似。