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文件
<?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:表示该属性可以有也可以没有。
还有一种属性的特征
被声明为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>
列举出要选的项,与下拉列表类似。