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文件

    1. <!ENTITY NAME "ENTITY VALUE">
    2. <!NOTATION Png SYSTEM "Image/jpeg">

    XML文件中引用格式:

    1. <root param1 = "Png">
    2. <sub>&NAME;</sub>
    3. </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”>
    属性类型
    image.png CDATA类型 可以包含除小于号“<”、大于号,与符号“”,双引号“”和单引号“”的任何字符(包括空字符 串),前提条件是它必须满足规范格式的约束。如果需要用到以上几个特殊字符,需要使用实体引用替代特 殊字符。
    Enumerated类型 枚举类型,声明了属性的备选值列表,属性必须从该列表中选择一个值作为属性值,通过竖线“|”把备选值隔开。
    <!ATTLIST 学生 答题 (正确|错误) “正确”>