第3章使用DTD规范XML文档3.1DTD基本概念3.1.1DTD简介对XML文档所作的规范和约定被称为DTD,也就是文档类型定义。可以把DTD看作是编写某类XML文档的一个模板。在一个DTD中,具体规定了引用该DTD的XML文档可使用哪些标记、父元素中能够包括哪些子元素、各个元素出现的先后顺序、元素可包含的属性、元素和属性值的数据类型,以及可使用的实体及符号规则等。DTD由许多约定和声明语句构成,这些语句可以包含在XML文档内部,被称为内部DTD;也可以独立保存为一个文件,而称为外部DTD。DTD主要具有下列几方面的作用:可以验证XML文档数据的有效性。可以为某类XML文档提供统一的格式和相同的结构。可以保证在一定范围内,XML文档数据的交流和共享。应用程序设计人员根据DTD就能够知道对应XML文档的逻辑结构,从而编写出相应的处理应用程序。3.1.2DTD的基本结构在一份DTD中,包含了对XML文档所使用的元素、元素间的关系、元素可用的属性、可使用的实体等的定义规则。一份DTD实际上是若干条有关元素、属性、实体等定义和声明语句的集合。书中的DTDDemo_01.xml是一个包含内部DTD声明的完整XML文档。在DTD中可以包含下列各种声明语句:DTD声明开始语句元素类型声明语句属性列表声明语句实体声明语句注释语句3.2DTD对元素的声明3.2.1元素声明的语法语法:!ELEMENTelement_nameelement_definition说明:!ELEMENT:元素声明语句的开始,关键字ELEMENT必须大写。element_name:所声明的元素名称。element_definition:对该元素内容的定义,用来规定该元素可以包含的内容。3.2.2各种元素的声明1.基本字符元素的声明2.含子元素的严格声明3.包含任意内容的声明4.子元素出现次数的声明5.选择性子元素的声明6.空元素的声明7.混合型元素的声明8.实体的声明3.2.3元素声明综合示例1.灵活控制元素出现次数2.元素的分组与嵌套3.3DTD对属性的声明3.3.1属性声明的语法语法:!ATTLISTElement_NameAttribute_NameType[added_declare]Attribute_NameType[added_declare]......说明:!ATTLIST:表示属性定义语句的开始,ATTLIST是关键字,必须大写。Element_Name:元素名,用来指定对该元素的属性进行声明。Attribute_Name:该元素具有的某个属性名,属性的命名规则与元素的命名规则是一致的。Type:属性的数据类型。added_declare:属性的附加声明,是一个可选项。3.3.2属性的附加声明1.#REQUIRED表示在相应的XML文档中该元素的这个属性是必须的,并必须给出一个属性值。2.#IMPLIED表示在XML文档中该元素的这个属性是可有可无的。3.#FIXEDAttValue表示在XML文档中该元素的这个属性值是所给定的固定值,不能更改。4.Default_Value在属性的附加声明中如果直接给定一个用引号括起来的字符串,表示预设的默认属性值。3.3.3属性的各种类型某个属性的类型(Type)规定了哪种类型的数据可以作为该属性的值。XML规范允许为元素的属性指定10种不同的类型。1.CDATA类型2.ID类型3.IDREF类型4.IDREFS类型5.ENTITY类型6.ENTITIES类型7.NMTOKEN类型8.NMTOKENS类型9.NOTATION类型10.Enumerated类型3.4DTD的引用3.4.1引用内部DTD语法:!DOCTYPE根元素名称[DTD声明语句序列]其中:!DOCTYPE:表示DTD声明的开始,关键字DOCTYPE必须大写。根元素名称:指定XML文档的根元素名称,这个根元素名称必须精确地与文档中实际的根元素名称一致。DTD声明语句序列:包含在一对方括号([])之内的若干条语句,用来对XML文档中所使用的元素、属性和实体等进行具体声明。注意:在XML文档中引用内部DTD时,应该在文档开头的XML声明语句中添加standalone=yes的说明。3.4.2引用外部DTD1.外部DTD的创建外部DTD是一个独立于XML文档的文件,使用.dtd为其文件扩展名。此种文件实际上也是一个文本文件,可用任何文本编辑器创建。在外部DTD中,除了没有内部DTD中的“!DOCTYPE根元素名称”语句之外,其他声明语句都是一样的。2.外部DTD的引用根据外部DTD性质的不同,又可将其分为私有DTD文件和公共DTD文件。私有DTD文件是指并未公开的DTD文件,通常属于某个组织内部或个人所有;公共DTD文件则是为某一应用领域或行业所制定,被国际上的标准组织或行业组织广泛认可的、公开的、标准的DTD文件。引用私有DTD文件的语法格式为:!DOCTYPERootElementNameSYSTEMDTD_URL引用公共DTD文件的语法格式为:!DOCTYPERootElementNamePUBLICDTD_nameDTD_URL注意:在XML文档中引用外部DTD时,应该在开头的XML声明语句中添加standalone=no说明。3.4.3混合引用DTD混合引用DTD是指:在一个带有内部DTD的XML文档中,再引用一个或多个外部DTD来共同规范文档中的内容。3.5实体的声明与引用3.5.1实体的概念与分类1.实体的概念在XML规格书中,实体(Entity)一词具有广泛的含义,通常是指与XML文档相关的任何下列型式的储存单元。有效的XML文档本身外部的DTD子集定义成DTD中外部实体的外部文档在DTD中定义的用引号括起来的字符串2.实体的分类一般实体:用来替代文档具体内容的实体。参数实体:只能在外部DTD中定义和引用的实体,不能在XML文档中引用。内部实体:所定义的实体内容并不涉及外部文档。外部实体:所定义的实体内容为外部独立存在的文件。可解析实体:包含字符、数字、文本块或标记的实体。不可解析实体:包含图片、声音等其他二进制数据的实体。3.5.2内部一般实体内部一般实体是指在DTD中定义的一段具体文字内容,通常在XML文档的元素中引用,也可在DTD语句中引用。在DTD中声明内部一般实体的语法:!ENTITYEntity_NameEntity_Value说明:!ENTITY:表示开始声明一个实体,关键字ENTITY必须大写。Entity_Name:表示实体的名称。Entity_Value:表示实体的具体内容。在XML文档或者DTD中引用内部一般实体的语法:&Entity_Name;3.5.3外部一般实体外部实体所对应的内容通常为一个独立存在的文件,在DTD中定义某个外部实体时需要指定该实体所对应文件的URL。在DTD中定义外部一般实体的语法:!ENTITYEntity_NameSYSTEMEntity_URL说明:!ENTITY:表示开始声明一个实体,关键字ENTITY必须大写。Entity_Name:表示外部实体的名称。SYSTEM:是定义为外部实体的关键字。Entity_URL:该实体所对应文件的URL。在XML文档中引用外部一般实体的语法:&Entity_Name;3.5.4内部参数实体参数实体的内容不仅可以包含文本,还可以包含元素类型声明、属性列表声明、一般实体声明、标签声明、处理指令或注释等。参数实体只能在DTD中引用,通常情况下只能在外部DTD文档中引用。声明内部参数实体的语法:!ENTITY%Entity_NameEntity_Value说明:!ENTITY:表示开始声明一个实体,关键字ENTITY必须大写。%:表示声明的是一个参数实体。Entity_Name:表示内部参数实体的名称。Entity_Value:表示实体的内容。在DTD中引用内部参数实体的语法:%Entity_Name;3.5.5外部参数实体一个独立的DTD文档可以被定义为一个外部参数实体,并可通过这个DTD文档的URL对其进行引用。声明外部参数实体的语法:!ENTITY%Entity_NameSYSTEMEntity_URL说明:!ENTITY:表示开始声明一个实体,关键字ENTITY必须大写。%:表示定义的是参数实体。Entity_Name:表示实体的名称。SYSTEM:是定义为外部实体的关键字。Entity_URL:外部实体文件的URL。在DTD中引用外部参数实体的语法:%Entity_Name;3.6XMLSchema简介3.6.1XMLSchema基本概念XMLSchema又被称为XML模式或者XML架构,用来定义和描述XML文档的结构、内容和语义。XMLSchema就像一幅蓝图,声明了XML文档中允许的数据和结构,具体规定了XML文档中可以包含哪些元素,这些元素又可以具有哪些子元素,并可规定这些子元素出现的顺序及其次数等。另外,XMLSchema还具体规定了XML文档中每个元素和属性的数据类型。与DTD相比,XMLSchema具有下面几个明显的优势。XMLSchema使用XML语法。XMLSchema支持名称空间。XMLSchema支持多种数据类型。XMLSchema具有更为强大和灵活的定义能力。3.6.2XMLSchema数据类型1.原生数据类型与派生数据类型2.自定义简单数据类型3.自定义复杂数据类型3.6.3XMLSchema根元素的声明在一个XMLSchema文档的开头,必须声明一个且只能声明一个名为Schema的根元素。声明格式如下:xsd:schemaxmlns:xsd=…………xsd:schema其中:xsd:schema表示这是Schema文档的根元素。xmlns是用来声明名称空间的专用关键词。3.6.4XML元素及其属性的声明1.对XML属性的声明2.对XML元素的声明3.6.5XMLSchema范例说明书中名为Client.xsd的XMLSchema范例文档,可用来定义和验证包含Client(客户)信息的XML文档。3.6.6XMLSchema的引用一个XMLSchema文档可用来定义和描述相应的XML文档,它提供了这个XML文档的内容模型细节。同时,一个XMLSchema文档也可用来验证相应XML文档实例的正确性,用来判断某个XML文档实例是否符合所规定的所有约束和所需要的所有格式等。