1、Click to edit Master title style,Click to edit Master text styles,第3章 文档类型定义(,DTD),本书前面章节曾经谈到,XML,文档的结构“可以用严格的语法约束”。本章将针对文档类型定义(,DTD),和架构(,Schema),进行讲述。这两种方法就是用于描述和约束,XML,文档结构的。描述、约束,XML,文档的结构,其目的并不在于削足适履,减弱,XML,的灵活性和可扩展性。,3.1 什么是,DTD,文档类型定义(,Document Type Definition,DTD),是关于文档中所用到标记符的语法规则,它指定标记符名称
2、标记符的出现次序、标记符的嵌套规则及标记符属性等。,3.1.1,DTD,的概述,DTD,是用于描述、约束,XML,文档结构的一种方法,它定义了,XML,文档中的合法元素。在,XML,中可以创建一个或多个元素(也就是,HTML,中所谓的标记),这些元素集(也叫标记集)可以通过,DTD,来定义。,DTD,是可有可无的,用它来描述、约束,XML,文档的结构,其目的主要是在,XML,文档的开头对文档内容和大体结构进行描述,以便提供对文档内容进行严格检验的依据。,1描述文档内容和结构,2验证文档的合法性,3提高,XML,应用的开发效率和规范程度。,3.1.2 第一个,DTD,示例,图,3.2,“,Gr
3、id,”,显示模式,3.1.3,DTD,的基本结构,DTD,的基本结构包括,XML,声明、元素(,ELEMENT),声明和属性列表(,ATTLIST),声明等。,3.1.4 定义元素及其后代,定义元素即对,XML,文档中所使用元素及其使用方法的定义。定义包括元素名称和构成元素的基本类型两部分,构成元素的基本类型包括简单类型和复合类型两种。包含子元素的元素称为父元素,子元素称为父元素的后代。,1元素定义的方法,2子元素声明约束,3.1.5 定义元素属性,元素属性就是该元素区别于其他元素的特有本质。为详细描述某一元素,在定义元素时可同时定义该元素的属性。元素可以定义属性也可以不定义属性。元素属性定
4、义包括属性名称、变量类型和预定义属性等,属性可以有一个,也可以有多个;多个属性时,各属性排列次序对,XML,文档不构成限制。,3.1.6,DTD,中的注释,DTD,中也可以添加注释,注释方式与,XML,文档相同。像所有注释一样,注释内容是为了方便人们理解源代码结构的,,XML,解析器在解析源代码时会忽略注释部分。,DTD,中的注释不能出现在声明语句当中,只能出现在声明语句的前面或后面。读者可以根据不同编码习惯,选择前面或后面进行注释。,3.1.7 在文档间共享通用的,DTD,为方便多个文档共享同一个,DTD,,可以将,DTD,单独定义在一个文件中。,XML,文档只要添加对,DTD,文件的引用就
5、可以起到文档内,DTD,的作用了。这样,多个,XML,文档就可共享同一个,DTD,文件了。,3.2,DTD,中的属性声明,在,DTD,声明元素的同时,还可以指定元素具有的属性。,DTD,中的属性声明不仅约束了,XML,文档中元素的属性名,还约束了元素的取值类型。,3.2.1 在,DTD,中声明属性,在,DTD,声明属性的标记是,,其声明语法如下所示。,在,DTD,声明属性目的是为了限制,XML,文档中元素的属性。应该充分考虑元素所具有的属性,抽取出元素属性的限制条件,再在,DTD,中进行属性声明,从而方便有效性检测。盲目声明属性反而会造成不必要的麻烦。,3.2.2 声明多个属性,与客观世界相似
6、元素可以有多个属性,这时就需要使用属性列表。属性列表声明语法如下所示。,元素属性的声明顺序不对,XML,文档构成限制,但为了便于理解和后期维护,这里建议在,XML,文档中的属性顺序应按照其引用的,DTD,中的声明顺序来排列。,3.2.3 指定属性的默认值,元素某属性可能是某一个不变常量,这时可指定该属性为这个常量。例如,假设电脑内存的主流配置是512,MB,,在定义,DTD,时指定该属性值为“512,MB”,,则,XML,文档中在不对该属性赋值的情况下就是该默认值。,3.2.4 属性类型,属性类型是对属性取值内容的限定,属性类型如表3.2所示。,3.2.5 预定义属性值,元素某属性可能是在,
7、XML,文档定义时必须单独填写的,也可以是可有可无的,还可能要求必须使用某一个指定的值。这些要求决定了,DTD,必须分别对待不同情况。#,REQUIRED、#IMPLIED、#FIXED,三个关键词与上诉三种情况分别对应。它们的含义如表3.3所示。,类型,含义,#REQUIRED,属性不能忽略,必须在元素的属性列表中出现,#IMPLIED,可选属性,可以不在元素的属性列表中出现,#FIXED,可选属性,如出现此属性,则其取值必须是固定的属性值。如忽略此属性,在验证文档后,元素将隐含此属性,其取值为固定的属性值,3.3 实体和外部,DTD,子集,实体(,ENTITY),是一种替代物,用于内容转义
8、在,XML,文档中可以直接用实体名来代替实体值使用。实体可以定义在文档的前序部分,也可以定义在,DTD,中。,内部实体完全在文档有效空间内部定义,内部实体的值,在,DTD,文档内部或,DOCTYPE,声明中声明;外部实体是在,XML,文档外部定义的实体,实体的值在外部资源中声明。,已解析实体的值经过,XML,解析器解析,成为,XML,或,DTD,的一部分,如字符、数字和文本对象等;未解析实体的值未经,XML,解析器解析,可以是二进制数据,如图片、声音等。,3.3.1 内部通用实体,内部通用实体一般用于声明文字替代,实体对象将替代其声明的文字内容。,3.3.2 外部通用实体,外部通用实体是在文
9、档实体以外定义的实体对象,要通过一个统一资源定位器(,URL),才能引用到该实体。外部通用实体是一个独立的文件,可被多个文档所引用。因为一个完整的,XML,文档就是一个有效的实体,所以,XML,通过对外部通用实体的引用,可以在一个,XML,文档中嵌入另一个,XML,文档,这样多个文档就可以组合成一个文档。,3.3.3 内部参数实体,参数实体是仅能在,DTD,中使用的实体,它使得能够在,DTD,中实现实体引用。参数实体在,DTD,中声明,只能在,DTD,文档中以“%实体名称;”的方式引用,在,XML,文档中不能引用,DTD,中定义的参数实体。,在成熟的,DTD,文档中常使用参数实体,一般有下面几
10、个目的。,(1)使,DTD,的结构更加清晰,并易于编写和管理。,(2)突出结构主线,使主题框架更明晰。,(3)用更明确的实体名称代替一般,DTD,类型名称,细化含义、便于理解。,3.3.4 外部参数实体,外部参数实体即是在外部,DTD,文档中声明的参数实体,它用于将多个独立的,DTD,文档组合成一个大的,DTD,文档。与外部通用实体相同,外部参数实体的引用方式如下所示。,3.3.5,根据片段创建文档,如前所述,一个,XML,文档可以根据需要分为多个文档片断。为方便说明,这里将3.2.11.2小节的示例分为多个片断,以达到相同的目的。,XML,文档关联,DTD,的方法有两种,一种是3.1.2小节
11、示例的方式,代码如下所示。,!,DOCTYPE,这种方式称为内部声明。,XML,文档也可以与外部独立保存的,DTD,文件相关联,这种方式称为外部声明。其声明方式如下所示。,3.3.6 结构完整的文档中的实体,和,DTD,结构完整的文档包括无,DTD,的结构完整的,XML,文档,如前两章的示例;包含,DTD,中的约束条件的有效的,XML,文档,如本章前面的示例;包含但不符合,DTD,中约束条件的完整的,XML,文档。第三种情况的,DTD,形式与第二种相同,所不同的是解析器只处理,DTD,中的,ENTITY,声明。,3.4,Schema,简介,在,XML,技术成为万维网推荐标准之后,,DTD,体现
12、出的不少局限性,万维网协会又推出了用于描述、约束、检验,XML,文档的新方法:,Schema(XML,架构)。,Schema,也是用来定义,XML,文档、并利用该定义验证,XML,文档是否符合要求的一种技术。,Schema,对,XML,文档结构的定义和描述主要作用是用来约束,XML,文档,并验证,XML,文档有效性。,3.4.1,Schema,概述,如上所述,,Schema,是针对,DTD,在,XML,应用过程的局限性而推出的,,Schema,除了可以与,DTD,一样,描述、约束,XML,文档的结构和内容外,还克服了,DTD,的缺陷。,Schema,与,DTD,优劣对比有如下几点。,1语法结构
13、问题,2数据类型问题,3文档结构问题,4名称空间问题,3.4.2 定义元素及其后代,Schema,文档中的元素通过使用,element,关键字来声明。元素声明定义了元素名称、内容和数据类型等属性。按照元素在,Schema,中的位置来分,在架构中处于“,schema”,根元素下的元素,称为“顶层元素”(,Top-level elements),。在顶层元素下,包含更多的元素,这些元素和顶层元素一起使用。顶层元素包含以下几项内容。,(1)声明元素和属性(,element、attribute,和,attributeGroup,)。,(2),定义数据类型、元素组(,complexType,、,simp
14、leType,和,group)。,(3),声明表示法(,notation)。,(4),注释文档(,annotation)。,3.4.3 Schema,的应用,此处还以3.1.2小节的示例为参照,将其中,DTD,实现的功能用,Schema,来代替,从而验证,Schema,的功能,也便于,Schema,与,DTD,的比较。,3.5,XML,命名空间,XML,作为一种允许用户定义自己标记的标记语言,很可能出现名称重复的情况,命名空间是一种避免名称冲突的方式。,W3C,颁布的命名空间(,NameSpace,),标准中对命名空间的定义是:,XML,命名空间提供了一套简单的方法,将,XML,文档和,URI
15、引用标记的名称相结合,来限定其中的元素和属性名。也即命名空间给,XML,名称添加前缀,使其能够区分所属的领域,从而为元素和属性提供唯一的名称,其最重要的用途是用于融合不同词汇集的,XML,文档。,3.5.1 什么是命名冲突,在相同的作用域当中,如果有两个元素或属性的名字完全相同,就会出现冲突。例如,我的电脑包括内存和硬盘两个元素,这两个元素都包括容量这个属性。当这两个元素统称为存储设备时,内存设备要用到两容量属性,这时容量属性就会出现冲突,不知道具体是哪一个容量属性。,3.5.2 解决命名冲突途径,为解决命名冲突的问题,引入命名空间的概念。命名空间的声明方法为:,xmlns,=,namesp
16、aceURI,或者,xmlns,:,某前缀=,namespaceURI,“,xmlns,=”,和“,xmlns,:,某前缀=为命名空间声明,等号后面以引号括起的值,必须是一个统一格式资源标识符(,URL),,用来代表名称空间所属的领域。第一种是默认命名空间声明,第二种是显式命名空间声明。,3.5.3 命名空间的使用,声明了命名空间,有了命名空间下的合法名称,就可以使用命名空间来区别具有相同名称的元素和属性了。命名空间的使用方法是在属于该名称空间的元素或属性名称前添加前缀和冒号“:”,表示其所属的名称空间。,3.5.4,DTD,与命名空间,在命名空间声明中,命名空间名其目的在于标识特定的命名空间
17、XML,解析器遇到一个命名空间声明后,就把等号左边的命名空间前缀和右边的命名空间名绑定在一起,对于后面使用了该前缀的合法名称,都可以归属于同一个命名空间中。根据,DTD,进行有效性检测时,也并不是把这个命名空间映射到,URI,所指的,DTD,文件,而是去找所有在,DOCTYPE,中声明的内部和外部的,DTD,,看其所定义的哪一个元素或属性名与文档中用到的元素或属性名相同。,3.6 小结,本章主要学习了,DTD,的基本概念和语法,包括在,XML,中声明,DTD,的方式,使用,DTD,声明元素、属性列表和实体等的方式。如何使用,DTD,来描述和约束文档结构是本章的主旨。另外,本章还粗略地讲述了,XML Schema,开发和,XML,命名空间的基础知识。,3.7 上机指导,DTD,可以检测,XML,文档是否符合原定规定和要求,从而保证,XML,文档数据的正确性和有效性。本章介绍了,DTD,的常用语法,结合示例给出了,DTD,的实用方法。,实验一:练习使用,XMLSpy,自动生成,DTD,文档,实验二:练习使用,XMLSpy,的,Grid,模式编辑,DTD,文档,实验三:,DTD,综合,






