DTD介绍
DTD(Document Type Definition)文档类型定义。在XML标准中,描述了如何创建DTD,以及如何将它与根据它的规则所编写的XML文档相关联,并且还定义了XML处理器应该如何对DTd进行处理,有了DTD就可以检测XML文档的结构是否正确。
DTD的作用
1.可以验证XML文档数据的有效性
2.可以为某类XML文档提供统一的格式和相同的结构
3.可以保证在一定范围内,XML文档数据的交流和共享
4.一个程序设计人员根据DTD就能够知道对应的XML文档逻辑结构,从而编写出相应的处理应用程序
DTD内部可以包含下列语句:
元素类型声明语句<!ELEMENT ….>
属性列表声明语句<!ATTLIST ….>
实体声明语句<!ENTITY …>
符号声明语句<!NOTATION …>
注释语句
DTD可以理解为是上述内容定义与声明的组成,DTD中所有关键字必须要大写。
引入DTD的方式
内部DTD
将语义约束与XML文档的内容放在同一个XML文档中,紧跟在XML声明和处理指令之后,以<!DOCTYPE开始,以]结束,语法格式如下:
<!DOCTYPE 根元素名称[
元素名称
]>
外部DTD
将DTD的约束写到文件中,然后在XML文档中按以下语法格式添加:
<!DOCTYPE (根元素名称) SYSTEM “外部DTD的URI地址”>
SYSTEM关键字表示文档使用的是私有DTD文件,“外部DTD文件的URI”可以是相对URI或者绝对URI,相对URI是相对于文档类型声明所在文档的位置。“外部DTD文件的URI”这部分也被称为系统标示符(system identifier)。
引入DTD文件并解析时,需要注意,实体(ENTITY)在引用时,如果实体可以被解析,实体名称前面加&,后面加;。不可以直接被XML解析的实体只能用于属性值处,仅需直接给出实体名称即可。
例如:DTD文件
<!ENTITY NAME "ENTITY VALUE">
<!NOTATION Png SYSTEM "Image/jpeg">
XML文件中引用格式:
<root param1 = "Png">
<sub>&NAME;</sub>
</root>
公用DTD
与外部DTD类似,但是该DTD引用公用的DTD的语法格式如下:
<!DOCTYPE (根元素名称) PUBLIC “DTD的标识名” “公用DTD的URL地址”>
公用DTD名称需要遵循一些约定。如果一项DTD是ISO标准,它的名字要以字符串“ISO”开始,如果是一个非ISO的标准组织批准的DTD,它的名字以“+”开始。如果这些开始字符或字符串后面接//和DTD所有者的名字,之后是另一个双斜杠和DTD描述的文档类型,接着又是一个双斜杠后接ISO639语言标识符,如EN标示英语。例如自定义的学生DTD可以采用下面的命名:
-//tanglin//DTD STUDENT1.0//ZH
以上可以整理为:
ISO标准 “ISO…”
标准组织标准 “+…”
非标准组织标准 “-…”
DTD中的元素定义(ETD)
说明:
元素名:即文档中元素的名称,唯一,符合XML文档命名规则。
元素类型描述:元素类型描述用于指定元素本身是否为空元素,如果不为空元素内容应该包括以下方面:
字符串类型:即#PCDATA,表示该元素的内容只能是字符串;
空元素:EMPTY,表示该元素只能是空元素;
包含子元素:表示该元素内部嵌套其它元素,具体包含子元素可能有:有序子元素、无序互斥子元素、无序组合子元素。子元素出现次数也会根据实际的定义而不同。
混合类型:即内容中既包括字符串类型又包括子元素,但混合类型在实际应用中不建议使用。
任意类型:即ANY,表示该标记对于元素内容没有限制,该标记的内容可以是字符串类型,也可以包含子元素,即包含字符串又包括子元素的混合类型,该标记也可以是空元素。在实际应用中尽量避免。
子元素
有序子元素
用逗号分离,表示子元素的出现顺序必须与声明时一致,并且不能被忽略。
无序互斥子元素
用竖线(|)分隔,表示任选其一,即多个子元素在文档定义中只能出现一个。
无序组合子元素(<!ENEMENT sub5 (sub6|sub7)>)
子元素出现频率可以根据不同的符号进行设定
子元素出现频率符号及其含义
+一次或多次
-0次或多次
?0次或多次
0次或多次
缺省 一次
混合类型
混合类型定义的子元素既可以包含字符串又可以包含子元素,其定义方法稍微复杂一些,典型的混合类型定义方法形如<!ELEMENT root (#PCDATA|sub1|sub2)*>,使用较少,不建议使用。
DTD中的属性
声明语法:<!ATTLIST 元素名称 属性名 属性类型[约束][缺省值]]+>
在一个ATTLIST最近拍卖会了哟定义同一个元素下的一个或多个属性。如果包含多个属性声明,属性声明之间使用空格间隔。
元素对属性的约束及其含义
#REQUIRED 表示属性是必需的 不可以没有
#IMPLIED 表示属性可以有也可以没有
#FIXED 表示在XML文档中只会给出一个元素属性所定义的固定值。只有当约束为该值时,才能给出缺省值,注意缺省值必须给出。
举例:<!ATTLIST root impParam CDATA #IMPLIED
fixParam CDATA #FIXED “default value”>
属性类型 CDATA类型 可以包含除小于号“<”、大于号,与符号“”,双引号“”和单引号“”的任何字符(包括空字符 串),前提条件是它必须满足规范格式的约束。如果需要用到以上几个特殊字符,需要使用实体引用替代特 殊字符。
Enumerated类型 枚举类型,声明了属性的备选值列表,属性必须从该列表中选择一个值作为属性值,通过竖线“|”把备选值隔开。
<!ATTLIST 学生 答题 (正确|错误) “正确”>