xml实用教程_第5章_XML_Schema结构.doc_第1页
xml实用教程_第5章_XML_Schema结构.doc_第2页
xml实用教程_第5章_XML_Schema结构.doc_第3页
xml实用教程_第5章_XML_Schema结构.doc_第4页
xml实用教程_第5章_XML_Schema结构.doc_第5页
免费预览已结束,剩余36页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 XML Schema结构返回主页上一章 下一章教学提示:XML schema是DTD(文件类型定义)之后第二代用来描述XML文件的标准。是用来对XML文档的类型定义的语言,用来规定XML文档的数据类型及组织方式,同时还是丰富的元数据资源。XML schema是一种定义文件的方式,拥有许多类似DTD的准则,但又要比DTD更为强大一些。W3C协会宣称,与DTD相比XML schema拥有许多优势。教学目标:理解XML Schema的含义及用途,了解XML Schema如何为XML文档结构、内容和数据类型建模提供严格而完整的标准,理解XML Schema的元素、属性和类型等构件,理解XML Schema的名称空间的概念。5.1 Schema概述5.2 Schema的格式和使用5.3 Schema元素声明5.4 Schema属性声明5.5 Schema的数据类型5.6 Schema的名称空间5.7使用XML Spy建立Schema文档小 结习 题写字版绘图板进入Editplus5.1 Schema概述 本章开头 下一节XML Schema是2001年5月正式发布的W3C(万维网联盟)的推荐标准,经过数年的大规模讨论和开发如今终于奠定下来,成为全球公认的XML环境下首选的数据建模工具。使用DTD虽然带来较大的方便,但是,DTD存在一些缺陷:一是它是用不同于XML的语言编写的,需要不同的分析器技术。这增加了工具开发商的负担,削减了软件瘦身的可能性,此外开发人员需要多学一门语言及其语法。而XML Schema是按标准XML规则编写的,更容易掌握。 二是DTD不支持名称空间。随着计算日益以XML为中心,信息的相互联系变得日益普及与深入,名称空间作用也将凸现。三是DTD在支持继承和子类方面的局限性,由于面向对象技术的出现,对继承和子类的支持已成为软件技术领域的主流概念。最后,DTD没有数据类型的概念,无法对特定元素施加数据类型,对强制性结构化无计可施,比如如何规定名为Date的数据必须包含有效值。这些就要依靠XML Schema了。XML Schema不仅可以定义XML文档的结构而且还允许约束文档的内容,这就不同于DTD了。另外,一个 XML Schema自身就是一个XML文档,其基于标签的语法比DTD中的特殊字符要清楚多了。XML Schema正是针对这些DTD的缺点而设计的,它完全使用XML作为描述手段,具有很强的描述能力、扩展能力和处理维护能力。XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了文档的结构和内容模式。XML Schema也是Web Services技术中需要使用的一个基本工具,然而并不是XML Schema的所有特性都会被广泛地使用,因此,将不对XML Schema规范做系统的介绍。目前主要有两种重要的模式:Microsoft XML Schema和W3C XML Schema,本章主要讨论W3C XML Schema 在下面的例子中,通过使用出现在schema元素中的名称空间声明xmlns:xsd= /2001/XMLSchema,使得模式文档中的每一个元素都有一个与XML Schema名称空间相联名称空间前缀xsd。尽管在语法上,可以使用任意的前缀形式,但是,名称空间前缀xsd被约定用于表示XML Schema名称空间。由于使用同样的前缀,所以同样的关联就会出现在内置的简单类型的名字中,例如xsd:string。这种形式关联的目的是用来表示当前的元素或简单类型是属于XML Schema语言的内置定义的,而不是属于模式文档作者自己的词汇表的。为了在这里清楚并且简单地表示,仅提及元素的名字和简单类型名,而忽略它们的前缀xsd。5.2 Schema的格式和使用 上一节 下一节 本章开头一个XSDL(XML Schema Definition Language)文档由元素、属性、名称空间和XML文档中的其它节点构成的,并且至少要包含:schema根元素和XML模式名称空间的定义、元素定义。5.2.1 简单实例【例5.1】关于书籍信息的XML文档,code5_1.xml。 三国演义 罗贯中 80.00 滚滚长江东逝水,浪花淘尽英雄。是非成败转头空:青山依旧在,几度夕阳红。白发渔樵江渚上,惯看秋月春风。一壶浊酒喜相逢:古今多少事,都付笑谈中。 经典好书 文艺出版社 1998.10 如何写这个XML文档的Schema呢?可以简单的依照它的结构来定义它的每个元素。首先加入一个xsd:schema元素。xsd:schemaxmlns:xsd=/2000/10/XMLSchema每个Schema文档都是从schema元素开始,并且只能有一个,用以控制Schema所使用的名称空间和另外几个选项,现在的Schema标准有好几种,这里决定它所采用的标准,因此是非常重要的!对应着XML文档的book标记,同样在Schema文档中也定义一个名为book的元素(element)。因为这个元素有属性(attributes)和非文本的子元素(non-textchildren),因此认为它是一个复杂类型(complexType)。而对于简单类型,只能有值,不能有子元素或者属性。同时还注意到book元素下的子元素,都是按照一定的顺序排列,因此使用顺序元素(sequenceelement)来描述。顺序元素(sequenceelement)是一个定义子元素排列顺序的元素,在下面的章节,还将其它类似的元素,如选择(choice)和全选(all)。接着定义title和author,都是xsd:string类型的简单元素,因为没有属性(attributes)或者子元素。xsd:string是一个已经在名域中预定义了的XMLSchema类型中的一个。接着,来处理publish元素,它也是一个复杂类型。注意它的基数的定义。同其它Schema定义语言不一样,W3CXMLSchema允许定义一个元素的使用基数,能指定元素的minOccurs(最小数)和maxOccurs(最大数)。这里设置maxOccurs为unbounded,这意味能有任意多的publish元素。这两个属性的默认值都是1。下面,用同样的方法定义其它的子元素。下面封闭complexType和element等元素:这样 publish元素就完成了。然后封闭book的sequence元素。现在,声明book元素的属性,通常是在最后这么做。这样做没有什么特别的原因,只不过W3CXMLSchema工作组认为在元素后定义属性感觉更加自然。最后,封闭所有剩下的元素。至此,一个Schema已经完成了。在这其中,最关键的在于根据文档的上下关系来定义每一个元素和属性,并且允许有多个同名元素带有不同的内容。为了这个目的,W3CXMLSchema被设计成一种有作用域的语言,它的每一个定义只能被它定义的子元素所看见。【例5.2】关于books.xml的模式定义的完整例子,code5_2.xsd 5.2.2 Schema的使用符合某个模式的文档称为实例。实例可以根据特定的模式进行验证。需要声明xml文档的schema实例名称空间(xmlns:xsi=/2001/XMLSchema-instance%2522),并把名称空间映射到前缀xsi。实例与模式之间有多对多的关系。一个模式可以描述多个有效的实例(通过使用不同的根元素类型来实现),同样,一个实例也可以被多个模式描述。例如一个实例可能拥有多个模式,它们有不同的验证级别。其中一个模式可能只验证结构,而另一个模式则根据数据类型来检查每一个数据项。1. Schema作用Schema文档就是用来验证XML文档的正确性,用来判断实例是否符合模式中所描述的所有约束。涉及到检查实例中所有的元素和属性。Schema主要检验如下内容: 验证数据的显示格式正确及是否超出值的范围。 验证所有必需的信息都存在。 确保不同使用者对文档理解的方式相同 除了对XML文档的验证外,Schema文档还在一定程度上扩充实例: 为元素和属性添加默认值和固定值。 使具有简单类型的元素和属性值中的空白符规范化。 2. Schema引用一个模式可能由多个模式文档构成。多个模式文档通过包含或导入机制来形成模式,当其他模式文档与主模式文档具有相同的目标名称空间时,需要使用包含。当模式文档之间各自拥有不同的目标名称空间时,需要使用导入。下面的例子建立一个单独用来验证一个实例的模式文档。【例5.3】关于多个模式文档通过包含实现定义的例子,code5_3.xsd 要验证XML文档,必须指定Schema文档的位置。模式的位置可以利用带有名称空间的模式的xsi:schemaLocation属性以及不带名称空间的XML模式的xsi:noNamespaceSchemaLocation属性来指定,它们位于根/顶级元素中或XML文档的任何其他元素中。当schema文档不包括targetNamespace属性时,应当通过XML文档根元素的noNamespaceSchemaLocation属性及W3C的schema实例名称空间(xmlns:xsi=/2001/XMLScheam-instance%2522)来引用XMLschema文件。针对上面的示例修改如下: 然而,如果Schema文件包含了一个targetNamespace属性,在XML文档中就将通过schemaLocation属性而不是noNamespaceSchemaLocation属性来引用schema文档。而且,这个属性所指定的值必须是完整的。它需要包含以空格分开的两部分,前一部分是URI,这个URI与schema文档的targetNamespace属性内部引用的URI是一致的;后一部分是schema文件完整路径及名称。另外,XML文档的根元素也必须声明schema实例名称空间(xmlns:xsi=/2001/XMLSchema-instance%2522)。Schema文档如下所示: 则修改上面的实例为: 5.3 Schema元素声明 上一节 下一节 本章开头元素是创建XML文档的主要构建材料。在W3CXMLSchema中,元素通过使用元素实现。元素声明用于给元素指定元素类型名称、内容和数据类型等属性。在XSDL中,元素声明可以是全局的,也可以是局部的。5.3.1 Schema根元素在XSD中必须定义一个且只能定义一个schema根元素。根元素不但表明了文档类型,而且还包括模式的约束、XML模式名称空间的定义,其他名称空间的定义、版本信息、语言信息和其他一些属性。定义如下:其中属性name指定Schema名称,也可以不需要。xmlns指定所属名称空间,紧跟在后面的xsd则是该名称空间的名称,名称空间” /2001/XMLSchema“被映射到xsd前缀,在后面将详细说明名称空间。5.3.2 element元素XSD中的元素是利用element标识符来声明的。其中name属性是元素的名字,type属性是元素值的类型,在这里可以是XML Schema中内置的数据类型或其他类型。具体定义如下:name是元素类型的名称,必须是以字母或下划线开头,而且只能够包含字母、数字、下划线、连接符及句号。type属性是必要的,说明元素的数据类型。下面的例子定义一个全局元素声明:author,为简单字符串类型。与以上文档对应的有效XML文档如下:罗贯中在元素的定义中还有2个属性:minOccurs和maxOccurs。其中minOccurs定义了该元素在父元素中出现的最少次数(默认为1,值为大于等于0的整数),maxOccurs定义了该元素在父元素中出现的最多次数(默认为1,值为大于等于0的整数)。在maxOccurs中可以把值设置为unbounded,表示对元素出现的最多次数没有限制。 表示元素author的类型为string,出现的次数最少为0(就是可选),最多不限制。一般来说,如果元素声明出现在Schema文档的顶级结构中,也就是说,它的父元素是schema,那么这些元素为全局元素。相反,局部元素声明只出现在复杂类型定义内部,局部元素声明只在该类型定义中使用,而不被其他复杂类型引用或在替换组中使用。不同的复杂类型,可以有相同元素类型名称的局部元素。【例5.4】显示title、author和price三种局部元素声明的模式文档,code5_4.xsd 5.3.3 设置默认值和固定值默认值和固定值通过给空元素增加值的方式来扩展实例。如果文档中存在空的元素,模式处理器根据模式文档的定义,会插入默认值或固定值。在XSDL中,默认值和固定值分别通过default和fixed属性设置。两个属性只能出现其中之一,它们是互斥的。如果元素为空,就填入默认值。下例中,声明了city元素,并指定了默认值为“佚名”。必须注意的是:元素声明中“空”的定义根据数据类型不同而有所不同。某些数据类型允许空值,包括string等。任何允许空字符串值的类型,元素都不会认为是空的,从而对于字符串类型元素,默认值不会被填充。相反,integer数据类型的空元素通常会被认为是空的,从而将填入默认值。此外,如果元素的xsi:nil属性被设置为true,那么就不会插入它的默认值。元素的默认值行为见表5.1。表5.1元素的默认值行为情 况扩充实例结果扩充之前扩充之后指定值保持原始值罗贯中罗贯中空元素(integer)填充值30空元素(string)没有填充值元素为空没有填充值固定值与默认值在相同的情况下添加,它们的差别仅在于如果元素拥有一个值,则该值必须和固定值相等。当模式解析器确定元素值和固定值实际上是否相等时,会考虑到元素的数据类型。price元素的数据类型为integer,所以整数1的所有形式在实例中都会被接受,包括01、+1和周围包含空白符的1。相反,对于author元素具有数据类型string。字符串“01“是无效的,因为与字符串“1“并不相等。按照以上定义,元素的固定值行为见表5.2。表5.2 元素的固定值行为有效实例无效实例120101+1+1 15.3.4 引用元素和替代引用是利用element标记符的ref属性实现的。主要适用于避免在文档中多次定义同一个元素,应当将经常使用的元素定义为根元素的子元素,即为全局元素,这样方便在文档的任何地方引用它。如每本书籍都有作者,其它产品也会有作者,因此可以把author属性声明为全局元素,供文档中多处引用。【例5.5】引用元素定义的模式文档,code5_5.xsd 在这里还可以为某个定义的元素起一个别名,主要是利用element标识符中的属性substitutionGroup实现的。方法如下: 以上文档对应的有效XML文档如下: 罗贯中或者: string5.4 Schema属性声明 上一节 下一节 本章开头属性声明用于命名属性并使之与某个特定的简单类型相关联。在XSDL中,实现的方法是使用attribute元素。在XML Schema文档中可以按照定义元素的方法定义属性,但受限制的程度较高。它们只能是简单类型,只能包含文本,且没有子属性。属性是没有顺序的,而元素是有顺序的。使用属性十分简练,元素的功能比属性强大,但在某些场合属性是非常有用的。通常,对于元数据使用属性,而对于数据则使用元素。如,用属性描述单位、语言或元素值的时间相依性。5.4.1 创建属性定义属性方法如下:该语句定义了一个名为isbn的属性,它的值必须是一个字符类型。属性也分全局和局部属性。全局声明的属性是schema元素的子元素,在模式文档中必须是唯一的。复杂类型的元素,使用ref属性通过名称来引用属性。局部属性声明只出现在复杂类型定义中,它们仅能在类型定义中使用,而不能被其他类型重用。下面的例子显示了两个属性isbn和amount 的全局声明,然后定义了一个复杂类型,使用ref属性通过名称来引用这两个属性。 use属性用于指示属性是必需的还是可选的,它出现在属性引用而不是属性声明中,这是因为它关系到属性在复杂类型中的出现,而不是属性本身。上面的例子定义的是全局的属性定义方式,如果要在复杂类型里声明属性,可以参照下面的例子: rbut上面的例子描述了isbn和amount两个属性的局部声明,它们完全出现在复杂类型定义中。局部声明的属性名称作用范围仅限于复杂类型内,在同一个复杂类型定义中,两个属性使用相同的限定名称是非法的。只有当属性会被多个名称空间的多个元素声明使用到时,才提倡将该属性声明为全局属性。5.4.2 为属性指派类型所有的属性声明都把属性指定为某种简单类型。所有的属性都具有简单类型而不是复杂类型,因为它们本身不能有子元素和属性。属性声明有三种方式:1. 在属性声明中通过用type属性指定命名简单类型。它可以是内置类型,也可以是用户自定义类型。2. 通过指定simpleType子属性来指定匿名类型。3. 既没有type属性,又没有simpleType子属性,从而不指定特定类型。在这种情况下,属性的类型为anySimpleType,它可以拥有任何值,只有它是结构合理的XML文档。下例显示四个属性的声明,采用了不同的类型指定方法。定义了grade属性并赋予gradeType类型,amount属性指定了内置类型integer,同时使用内嵌的匿名简单类型来声明bookcategory属性,第四个属性anything没有指定特定的类型。 5.4.3 属性的默认值和固定值对于属性来说,也可以通过默认值和固定值的方式增加未出现的属性来扩充实例。定义和扩充的方式与元素一致。在XSDL中,默认值和固定值分别通过default和fixed属性设置。两个属性只能出现其中之一,它们是互斥的。如果属性在元素中缺失,它的默认值将会被填入。如果属性出现,且包含任意值,它将保持该值不变。下面的例子显示了book元素的声明,它包含一个属性amount,该属性被指定了默认值。 固定值与默认值在基本一样的情况下被插入,区别在于,其值应和固定值相等。同时也会考虑属性的类型。 5.5 Schema的数据类型 上一节 下一节 本章开头W3C XML Schema可以把XML文档中的元素声明为特定的类型,准许解析器检查文档的内容及其结构。XML Schema定义了两种主要的数据类型:预定义简单类型和复杂类型。这两种数据类型之间的主要区别是复杂类型可以象数据一样包含其他元素而简单类型则只能包含数据。简单类型给予了XML Schema低级类型检查能力。5.5.1 简单类型元素和属性声明都可以使用简单类型来描述数据类型。1. 简单类型的种类原子类型(不可分割的类型,如string, integer等系统内建的类型)、列表类型、联合类型合起来统一称为简单类型。XML Schema具有低级类型检查能力,允许把元素定义为表5.3中的任何类型之一。赋予简单类型的元素具有字符类型内容,但没有子元素或属性。 原子类型具有不可分割的值,如10和large 列表类型的值为用空白符隔开的原子值列表,如10 large 2 联合类型的值可以是原子值,也可以是列表值。它们的区别在于该类型的有效值集是两个或多个其他简单类型值空间的联合。如要对于学生的成绩评定等级,可以定义一个联合类型,它允许的值既可以是0到100的整数,也可以是优、良、合格或不合格。 表5.3 XML Schema支持的部分简单类型内建类型定义string字符串数据,如online book shopboolean二元类型的True或者False。date表示日期,格式是CCYY-MM-DD。dateTime表示当前时间,由日期和时间组成,如11/18/80,10:00amtime24小时格式的时间可根据时区调节。decimal任意精度和位数的十进制数,如27.93integer整数,如34float标准的32位浮点数,如11.87e-2在前面一些例子中,有几个元素和属性被声明为简单类型。其中一些简单类型如 string 和integer是XML Schema中内置的,其它的一些则是源于(如果使用对象技术的语言就是继承)内置的类型。除此之外,新的简单类型可以通过从现有的简单类型(内置的简单类型以及源于内置简单类型的简单类型)引出定义。通常,通过重新约束一个现存的简单类型来引出一个新的简单类型。换句话说,新类型的合法值范围是现有类型的值范围的子集。使用simpleType元素来定义和命名新的简单类型,使用restriction元素来指出现有的基类型,并且用它来标识约束值范围的细节。 假设希望建立一个新的整数类型称为myInteger,它的值范围为10000到99999。那么定义应当基于简单类型integer,然后定义它的值范围为10000到99999。为了定义myInteger,这样来约束integer的范围,示例如下: 这个例子显示了由一个基本类型定义和两个值域区间方面描述的组合,通过这三个要素对myInteger实施定义。2. 简单类型命名定义简单类型既可以为命名简单类型又可以为匿名简单类型。命名简单类型总是在全局定义,而且要求在模式的数据类型中具有唯一名称。类型的名称必须为XML无冒号名称,即必须是字母或下划线开始,只能包含字、数字、下划线、连字符和句号。如上面的例子,简单类型名为myInteger。这种类型的模式构造非常直截了当,但有些不实用。特别是如果定义了许多只应用一次而且包含非常少约束的类型,在这种情况下,一个类型应该能够被更简单的定义。这样的简单定义通常的形式是一个节省了名称和外部引用开销的匿名类型。在下面的示例中,publish元素声明使用了匿名类型定义。一般的来说,通过元素中是否包含“type=”这个属性可以判断匿名元素定义(或者是匿名属性定义)。如果出现无名称的类型定义,也可以认为是匿名元素(属性)定义。 3. 简单类型的限制每个简单类型都是从另一个简单类型派生而来,这另一个简单类型称为基类型。派生可以从原子类型,也可以从用户定义的简单类型派生。上面的例子都从内置的原子类型派生成新的简单类型。所有新的简单类型都以某种方式限制其基类型的值空间。下面的例子从上面定义的myInteger类型进一步限制: 简单类型定义时,都是通过restriction元素来定义限制,通过base属性来规定一种基类型。在restriction内,可以以任何顺序指定任何面(facet),来对类型取值进一步限制。根据面的不同,这个元素或属性具有不同的有效值。表5.4是XML Schema面的定义。对每个内置的原子类型,都有一套定义时可用的面。如果某个面适用于某种原子类型,那么也适用于派生于该类型的简单类型。这里有必要举例说明枚举的简单类型定义,下面的例子定义了一个简单类型category,用于说明书籍的类别: 表5.4 XML Schema面的定义面意 义minExclusive值必须大于x,相对就有maxExclusiveminInclusive值必须大于等于x,相对就有maxInclusivelength值的长度必须等于xminLength值的长度必须大于等于x,相对就有maxLengthtotalDigits有效的数字的位数必须小于等于xfractionDigits小数位数必须小于等于xwhiteSpace应该保留、替换或压缩whitespace,决定于xenumerationx是一个有效值patternx是值可以匹配一个正则表达式4. 列表类型除了使用简单类型中描述的原子类型,XML Schema还定义了其它两种简单类型:列表类型和联合类型。列表类型是由一组原子类型组成,因此它的每一个部分(原子)本身都是有意义的,定义时以空格隔开原子

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论