版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 XML Schema结构 返回主页 上一章 下一章教学提示:XML schema是DTD(文件类型定义)之后第二代用来描述XML文件的标准。是用来对XML文档的类型定义的语言,用来规定XML文档的数据类型及组织方式,同时还是丰富的元数据资源。XML schema是一种定义文件的方式,拥有许多类似DTD的准则,但又要比DTD更为强大一些。W3C协会宣称,与DTD相比XML schema拥有许多优势。教学目标:理解XML Schema的含义及用途,了解XML Schema如何为XML文档结构、内容和数据类型建模提供严格而完整的标准,理解XML Schema的元素、属性和
2、类型等构件,理解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存在一些缺
3、陷:一是它是用不同于XML的语言编写的,需要不同的分析器技术。这增加了工具开发商的负担,削减了软件瘦身的可能性,此外开发人员需要多学一门语言及其语法。而XML Schema是按标准XML规则编写的,更容易掌握。 二是DTD不支持名称空间。随着计算日益以XML为中心,信息的相互联系变得日益普及与深入,名称空间作用也将凸现。三是DTD在支持继承和子类方面的局限性,由于面向对象技术的出现,对继承和子类的支持已成为软件技术领域的主流概念。最后,DTD没有数据类型的概念,无法对特定元素施加数据类型,对强制性结构化无计可施,比如如何规定名为Date的数据必须包含有效值。这些就要依靠XML Schema了。
4、XML Schema不仅可以定义XML文档的结构而且还允许约束文档的内容,这就不同于DTD了。另外,一个 XML Schema自身就是一个XML文档,其基于标签的语法比DTD中的特殊字符要清楚多了。XML Schema正是针对这些DTD的缺点而设计的,它完全使用XML作为描述手段,具有很强的描述能力、扩展能力和处理维护能力。XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了文档的结构和内容模式。XML Schema也是Web Services技术中需要使用的一个基本工具,然而并不是XML Schema的所有特性都会被广泛地使用,因此,将不对XML Schema规
5、范做系统的介绍。目前主要有两种重要的模式:Microsoft XML Schema和W3C XML Schema,本章主要讨论W3C XML Schema 在下面的例子中,通过使用出现在schema元素中的名称空间声明xmlns:xsd= "/2001/XMLSchema",使得模式文档中的每一个元素都有一个与XML Schema名称空间相联名称空间前缀xsd。尽管在语法上,可以使用任意的前缀形式,但是,名称空间前缀xsd被约定用于表示XML Schema名称空间。由于使用同样的前缀,所以同样的关联就会出现在内置的简单类型的名字中,例如xsd
6、:string。这种形式关联的目的是用来表示当前的元素或简单类型是属于XML Schema语言的内置定义的,而不是属于模式文档作者自己的词汇表的。为了在这里清楚并且简单地表示,仅提及元素的名字和简单类型名,而忽略它们的前缀xsd。5.2 Schema的格式和使用 上一节 下一节 本章开头一个XSDL(XML Schema Definition Language)文档由元素、属性、名称空间和XML文档中的其它节点构成的,并且至少要包含:schema根元素和XML模式名称空间的定义、元素定义。5.2.1 简单实例【例5.1】关于书籍信息的XML文档,code5_1.xml。<?xml ver
7、sion="1.0" encoding="gb2312"?><book isbn="0-764-58007-8"> <title>三国演义</title> <author>罗贯中</author> <price>80.00 </price> <resume>滚滚长江东逝水,浪花淘尽英雄。是非成
8、败转头空:青山依旧在,几度夕阳红。白发渔樵江渚上,惯看秋月春风。一壶浊酒喜相逢:古今多少事,都付笑谈中。</resume> <recommendation>经典好书</recommendation> <publish> <publisher>文艺出版社</publisher> <p
9、ubdate>1998.10</pubdate> </publish></book>如何写这个XML文档的Schema呢?可以简单的依照它的结构来定义它的每个元素。首先加入一个xsd:schema元素。<?xml version="1.0" encoding=" gb2312"?> <xsd:schema xmlns:xsd="/2000/10/XMLSchema每个Schema
10、文档都是从schema元素开始,并且只能有一个,用以控制Schema所使用的名称空间和另外几个选项,现在的Schema标准有好几种,这里决定它所采用的标准,因此是非常重要的!对应着XML文档的book标记,同样在Schema文档中也定义一个名为book的元素(element)。因为这个元素有属性(attributes)和非文本的子元素(non-text children),因此认为它是一个复杂类型(complexType)。而对于简单类型,只能有值,不能有子元素或者属性。同时还注意到book元素下的子元素,都是按照一定的顺序排列,因此使用顺序元素(sequence elem
11、ent)来描述。<xsd:element name="book"><xsd:complexType><xsd:sequence>顺序元素(sequence element)是一个定义子元素排列顺序的元素,在下面的章节,还将其它类似的元素,如选择(choice)和全选(all)。接着定义title和author,都是xsd:string类型的简单元素,因为没有属性(attributes)或者子元素。xsd:string是一个已经在名域中预定义了的XML Schema类型中的一个。 <xsd:el
12、ement name="title" type="xsd:string"/><xsd:element name="author" type="xsd:string"/><xsd:element name="price" type="xsd:integer" /><xsd:element name="resume" type="xsd:string" />&
13、lt;xsd:element name="recommendation" type="xs:string" />接着,来处理publish元素,它也是一个复杂类型。注意它的基数的定义。<xsd:element name="publish" minOccurs="0" maxOccurs="unbounded"><xsd:complexType><xsd:sequence>同其它Schema定义语言不一样,W3C XML Schema允
14、许定义一个元素的使用基数,能指定元素的minOccurs(最小数)和maxOccurs(最大数)。这里设置maxOccurs为unbounded,这意味能有任意多的publish元素。这两个属性的默认值都是1。下面,用同样的方法定义其它的子元素。<xsd:element name="publisher" type="xsd:string" /><xsd:element name="pubdate" type="xsd:date" />下面封闭complexType和element等元素:&l
15、t;/xsd:sequence></xsd:complexType></xsd:element>这样 publish"元素就完成了。然后封闭book的sequence元素。</xsd:sequence> 现在,声明book元素的属性,通常是在最后这么做。这样做没有什么特别的原因,只不过W3C XML Schema工作组认为在元素后定义属性感觉更加自然。<xsd:attribute name="isbn" type="xsd:string"/>
16、最后,封闭所有剩下的元素。</xsd:complexType></xsd:element></xsd:schema>至此,一个Schema已经完成了。在这其中,最关键的在于根据文档的上下关系来定义每一个元素和属性,并且允许有多个同名元素带有不同的内容。为了这个目的,W3C XML Schema 被设计成一种有作用域的语言,它的每一个定义只能被它定义的子元素所看见。【例5.2】关于books.xml的模式定义的完整例子,code5_2.xsd<?xml version="1.0" encoding=gb2
17、312" ?><xsd:schema xmlns:xsd="/2001/XMLSchema"><xsd:element name="book"> <xsd:complexType> <xsd:sequence> <xsd:element name="title" type=&quo
18、t;xsd:string" /> <xsd:element name="author" type="xsd:string"/> <xsd:element name="price" type="xsd:integer" /> &l
19、t;xsd:element name="resume" type="xsd:string" /> <xsd:element name="recommendation" type="xsd:string" /> <xsd:element name="publish" minOccurs="0&quo
20、t; maxOccurs="unbounded"> <xsd:complexType> <xsd:sequence> &
21、#160; <xsd:element name="publisher" type="xsd:string" /> <xsd:element name="pubdate" type="xsd:date" /> &
22、#160; </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> <xs
23、d:attribute name="isbn" type="xsd:string" /> </xsd:complexType></xsd:element></xsd:schema>5.2.2 Schema的使用符合某个模式的文档称为实例。实例可以根据特定的模式进行验证。需要声明xml文档的schema实例名称空间(xmlns:xsi="/2001/XMLSchema-instance%2522),并把名称空间映射到前缀xsi。实例与模式
24、之间有多对多的关系。一个模式可以描述多个有效的实例(通过使用不同的根元素类型来实现),同样,一个实例也可以被多个模式描述。例如一个实例可能拥有多个模式,它们有不同的验证级别。其中一个模式可能只验证结构,而另一个模式则根据数据类型来检查每一个数据项。1. Schema作用Schema文档就是用来验证XML文档的正确性,用来判断实例是否符合模式中所描述的所有约束。涉及到检查实例中所有的元素和属性。Schema主要检验如下内容:· 验证数据的显示格式正确及是否超出值的范围。 · 验证所有必需的信息都存在。 · 确保不同使用者对文档理解的方式相同 除了对XML文档的验证外
25、,Schema文档还在一定程度上扩充实例:· 为元素和属性添加默认值和固定值。 · 使具有简单类型的元素和属性值中的空白符规范化。 2. Schema引用一个模式可能由多个模式文档构成。多个模式文档通过包含或导入机制来形成模式,当其他模式文档与主模式文档具有相同的目标名称空间时,需要使用包含。当模式文档之间各自拥有不同的目标名称空间时,需要使用导入。下面的例子建立一个单独用来验证一个实例的模式文档。【例5.3】关于多个模式文档通过包含实现定义的例子,code5_3.xsd<?xml version="1.0" encoding="gb23
26、12" ?><xsd:schema xmlns:xsd="/2001/XMLSchema"xmlns="/ord"targetNamespace="/ord"> <xsd:include schemaLocation="moreBookInfo.xsd"/> <xsd:import namespace
27、="/ord" schemaLocation="publish.xsd" /> <!-.-></xsd:schema>要验证XML文档,必须指定Schema文档的位置。模式的位置可以利用带有名称空间的模式的xsi:schemaLocation属性以及不带名称空间的XML模式的xsi:noNamespaceSchemaLocation属性来指定,它们位于根/顶级元素中或XML文档的任何其他元素中。当schema文档不包括targetNamespace属性时,
28、应当通过XML文档根元素的noNamespaceSchemaLocation属性及W3C的schema实例名称空间(xmlns:xsi="/2001/XMLScheam-instance%2522)来引用XML schema文件。针对上面的示例修改如下:<?xml version="1.0" encoding="gb2312" ?><book xmlns:xsi="/2001/XMLSchem
29、a-instance"xsi:noNamespaceSchemaLocation="books.xsd"isbn="0-764-58007-8"> <!-.-></book>然而,如果Schema文件包含了一个targetNamespace 属性,在XML文档中就将通过schemaLocation属性而不是noNamespaceSchemaLocation属性来引用schema文档。而且,这个属性所指定的值必须是完整的。它需要包含以空格分开的两部分,前一部分是URI,这
30、个URI与schema文档的targetNamespace属性内部引用的URI是一致的;后一部分是schema文件完整路径及名称。另外,XML文档的根元素也必须声明schema实例名称空间(xmlns:xsi="/2001/XMLSchema-instance%2522)。Schema文档如下所示:<xsd:schema xmlns:xsd="/2001/XMLSchema" targetNamespace="/book">
31、 <!-.-></xsd:schema>则修改上面的实例为:<?xml version="1.0" encoding="gb2312" ?><book xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/book book.xsd"xmlns="http
32、://book"isbn="0-764-58007-8"> <!-.-></book>5.3 Schema元素声明 上一节 下一节 本章开头元素是创建XML文档的主要构建材料。在W3C XML Schema中,元素通过使用<element>元素实现。元素声明用于给元素指定元素类型名称、内容和数据类型等属性。在XSDL中,元素声明可以是全局的,也可以是局部的。5.3.1 Schema根元素 在XSD中必须定义一个且只能定义一个schema
33、根元素。根元素不但表明了文档类型,而且还包括模式的约束、XML模式名称空间的定义,其他名称空间的定义、版本信息、语言信息和其他一些属性。定义如下:<?xml version="1.0" encoding="gb2312" ?><xsd: schema name="mySchema" xmlns:xsd="/2001/XMLSchema"></xsd: schema>其中属性name指定Schema名称,也可以不需要。xmlns指定所属名称空间,紧跟
34、在后面的xsd则是该名称空间的名称,名称空间” /2001/XMLSchema“被映射到xsd前缀,在后面将详细说明名称空间。5.3.2 element元素XSD中的元素是利用element标识符来声明的。其中name属性是元素的名字,type属性是元素值的类型,在这里可以是XML Schema中内置的数据类型或其他类型。具体定义如下:<xsd:element name="author" type="xsd:string" /> name是元素类型的名称,必须是以字母或下划线开头,而且只能够包含字母、
35、数字、下划线、连接符及句号。type属性是必要的,说明元素的数据类型。下面的例子定义一个全局元素声明:author,为简单字符串类型。<xsd:schema xmlns:xsd="/2001/XMLSchema"><xsd:element name="author" type="xsd:string" /></xsd:schema>与以上文档对应的有效XML文档如下:<?xml version="1.0" encoding="gb2
36、312" ?><author>罗贯中</author> 在元素的定义中还有2个属性:minOccurs和maxOccurs。其中minOccurs定义了该元素在父元素中出现的最少次数(默认为1,值为大于等于0的整数),maxOccurs定义了该元素在父元素中出现的最多次数(默认为1,值为大于等于0的整数)。在maxOccurs中可以把值设置为unbounded,表示对元素出现的最多次数没有限制。<xsd:schema xmlns:xsd="/2001/XMLSchema">
37、0; <xsd:element name="author" type="xsd:string" minOccurs="0" maxOccurs="unbounded" /></xsd:schema>表示元素author的类型为string,出现的次数最少为0(就是可选),最多不限制。一般来说,如果元素声明出现在Schema文档的顶级结构中,也就是说,它的父元素是schema,那么这些元素为全局元素。相反,局部元素声明只出现在复杂类型定义内部,局部元素声明只在该类型定义中使用,而不被其他复杂类
38、型引用或在替换组中使用。不同的复杂类型,可以有相同元素类型名称的局部元素。【例5.4】显示title、author和price三种局部元素声明的模式文档,code5_4.xsd<?xml version="1.0" encoding="gb2312"?><xsd:schema xmlns:xsd="/2000/10/XMLSchema"> <xsd:complexType name="book">
39、160; <xsd:sequence> <xsd:element name="title" type="xsd:string"/> <xsd:element name="author"
40、type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="price" type="xsd:integer"/> </xsd:sequence>
41、60; </xsd:complexType></xsd:schema>5.3.3 设置默认值和固定值默认值和固定值通过给空元素增加值的方式来扩展实例。如果文档中存在空的元素,模式处理器根据模式文档的定义,会插入默认值或固定值。在XSDL中,默认值和固定值分别通过default和fixed属性设置。两个属性只能出现其中之一,它们是互斥的。如果元素为空,就填入默认值。下例中,声明了city元素,并指定了默认值为“佚名”。<xsd:element name="author" type="xsd:string" defa
42、ult="佚名"/>必须注意的是:元素声明中“空”的定义根据数据类型不同而有所不同。某些数据类型允许空值,包括string等。任何允许空字符串值的类型,元素都不会认为是空的,从而对于字符串类型元素,默认值不会被填充。相反,integer数据类型的空元素通常会被认为是空的,从而将填入默认值。此外,如果元素的xsi:nil属性被设置为true,那么就不会插入它的默认值。<?xml version="1.0" encoding="gb2312"?> <xsd:schema xm
43、lns:xsd="/2000/10/XMLSchema"><xsd:element name="title" type="xsd:string"/><xsd:element name="author" type="xsd:string" default="N/A" /><xsd:element name="price" type=
44、"xsd:integer" default="30" /></xsd:schema> 元素的默认值行为见表5.1。表5.1元素的默认值行为情 况扩充实例结果扩充之前扩充之后指定值保持原始值<author>罗贯中</author><author>罗贯中</author>空元素(integer)填充值<price></price><price>30</price>空元素(string)没有填充值<author>&
45、lt;/author><author></author>元素为空没有填充值<price xsi:nil="true"/><price xsi:nil="true"/>固定值与默认值在相同的情况下添加,它们的差别仅在于如果元素拥有一个值,则该值必须和固定值相等。当模式解析器确定元素值和固定值实际上是否相等时,会考虑到元素的数据类型。price元素的数据类型为integer,所以整数1的所有形式在实例中都会被接受,包括01、+1和周围包含空白符的1。相反,对于author元素具有数据类型string。字符
46、串“01“是无效的,因为与字符串“1“并不相等。<xsd:element name="author" type="xsd:string" fixed="1" /><xsd:element name="price" type="xsd:integer" fixed="1" />按照以上定义,元素的固定值行为见表5.2。表5.2 元素的固定值行为有效实例无效实例<price>1</price><price>2</p
47、rice><price>01</price><author>01</author><price>+1</price><author>+1</author><price></price><author></author><price/><author> </author><author>1</author><author /> 5.3.4 引用
48、元素和替代引用是利用element标记符的ref属性实现的。主要适用于避免在文档中多次定义同一个元素,应当将经常使用的元素定义为根元素的子元素,即为全局元素,这样方便在文档的任何地方引用它。如每本书籍都有作者,其它产品也会有作者,因此可以把author属性声明为全局元素,供文档中多处引用。【例5.5】引用元素定义的模式文档,code5_5.xsd<xsd:schema xmlns:xsd="/2001/XMLSchema"> <xsd:element name="author&q
49、uot; type="xsd:string"/> <xsd:element name="book"> <xsd:complexType> <xsd:sequence>
50、160; <xsd:element ref="author" /> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema>在这里还可以为某
51、个定义的元素起一个别名,主要是利用element标识符中的属性substitutionGroup实现的。方法如下: <xsd:schema xmlns:xsd="/2001/XMLSchema"> <xsd:element name="writer" type="xsd:string" substitutionGroup="author" /> <xsd:element n
52、ame="author" type="xsd:string"/> <xsd:element name="book"> <xsd:complexType> <xsd:sequence>
53、160; <xsd:element ref="author" /> </xsd:sequence> </xsd:complexType> </xsd:element><
54、;/xsd:schema>以上文档对应的有效XML文档如下:<?xml version="1.0"?><book> <author>罗贯中</author></book>或者:<?xml version="1.0"?><book> <writer>string</writer></book> 5.4 Schema属性声明 上一节 下一节 本章开头属性
55、声明用于命名属性并使之与某个特定的简单类型相关联。在XSDL中,实现的方法是使用attribute元素。在XML Schema文档中可以按照定义元素的方法定义属性,但受限制的程度较高。它们只能是简单类型,只能包含文本,且没有子属性。属性是没有顺序的,而元素是有顺序的。使用属性十分简练,元素的功能比属性强大,但在某些场合属性是非常有用的。通常,对于元数据使用属性,而对于数据则使用元素。如,用属性描述单位、语言或元素值的时间相依性。5.4.1 创建属性定义属性方法如下:<xsd:attribute name="isbn" type="xsd:string&quo
56、t;/> 该语句定义了一个名为isbn的属性,它的值必须是一个字符类型。属性也分全局和局部属性。全局声明的属性是schema元素的子元素,在模式文档中必须是唯一的。复杂类型的元素,使用ref属性通过名称来引用属性。局部属性声明只出现在复杂类型定义中,它们仅能在类型定义中使用,而不能被其他类型重用。下面的例子显示了两个属性isbn和amount 的全局声明,然后定义了一个复杂类型,使用ref属性通过名称来引用这两个属性。<xsd:schema xmlns:xsd="/2001/XMLSchema"> &l
57、t;xsd:attribute name="isbn" type="xsd:string" /> <xsd:attribute name="amount" type="xsd:integer" /> <xsd:complexType name="book"> <xsd:attribute ref="isbn" use="required" />
58、 <xsd:attribute ref="amount"> </xsd:complexType></xsd:schema>use属性用于指示属性是必需的还是可选的,它出现在属性引用而不是属性声明中,这是因为它关系到属性在复杂类型中的出现,而不是属性本身。上面的例子定义的是全局的属性定义方式,如果要在复杂类型里声明属性,可以参照下面的例子:<xsd:schema xmlns:xsd="/2001/XMLSchema"> <x
59、sd:complexType name="book"> <xsd:attribute name="isbn" type="xsd:string" use="required" /> <xsd:attribute name="amount" type="xsd:integer" /> </xsd:complexType></xsd:schema&g
60、t;rbut上面的例子描述了isbn和amount两个属性的局部声明,它们完全出现在复杂类型定义中。局部声明的属性名称作用范围仅限于复杂类型内,在同一个复杂类型定义中,两个属性使用相同的限定名称是非法的。只有当属性会被多个名称空间的多个元素声明使用到时,才提倡将该属性声明为全局属性。5.4.2 为属性指派类型所有的属性声明都把属性指定为某种简单类型。所有的属性都具有简单类型而不是复杂类型,因为它们本身不能有子元素和属性。属性声明有三种方式:1. 在属性声明中通过用type属性指定命名简单类型。它可以是内置类型,也可以是用户自定义类型。2. 通过指定simpleType子属性来指定匿名类型。3.
61、 既没有type属性,又没有simpleType子属性,从而不指定特定类型。在这种情况下,属性的类型为anySimpleType,它可以拥有任何值,只有它是结构合理的XML文档。下例显示四个属性的声明,采用了不同的类型指定方法。定义了grade属性并赋予gradeType类型,amount属性指定了内置类型integer,同时使用内嵌的匿名简单类型来声明bookcategory属性,第四个属性anything没有指定特定的类型。<xsd:attribute name="amount" type="xsd:integer" /><xsd:
62、attribute name="grade" type="gradeType" /><xsd:attribute name="bookcategory"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="文艺"/>
63、60; <xsd:restriction> </xsd:simpleType></xsd:attribute><xsd:attribute name="anything"/>5.4.3 属性的默认值和固定值对于属性来说,也可以通过默认值和固定值的方式增加未出现的属性来扩充实例。定义和扩充的方式与元素一致。在XSDL中,默认值和固定值分别通过default和fixed属性设置。两个属性只能出现其中之一,它们是互斥的。如果属性在元素中缺失,它的默认值将会被填入。如果属性出现,且包含任意值,它将保持该值不变。
64、下面的例子显示了book元素的声明,它包含一个属性amount,该属性被指定了默认值。<xsd:element name="book"> <xsd:complexType> <xsd:attribute name="amount" type="xsd:integer" default="100"/> </xsd:complexType></xsd:element>固定值与默认值在基本一样的情况下被
65、插入,区别在于,其值应和固定值相等。同时也会考虑属性的类型。<xsd:element name="book"> <xsd:complexType> <xsd:attribute name="isbn" type="xsd:string" fixed="100"/> <xsd:attribute name="amount" type="xsd:integer&qu
66、ot; fixed="100" /> </xsd:complexType></xsd:element>5.5 Schema的数据类型 上一节 下一节 本章开头W3C XML Schema可以把XML文档中的元素声明为特定的类型,准许解析器检查文档的内容及其结构。XML Schema定义了两种主要的数据类型:预定义简单类型和复杂类型。这两种数据类型之间的主要区别是复杂类型可以象数据一样包含其他元素而简单类型则只能包含数据。简单类型给予了XML Schema低级类型检查能力。5.5.1 简单类型元素和属性声明都可以使用简单类型来描述数据
67、类型。1. 简单类型的种类原子类型(不可分割的类型,如string, integer等系统内建的类型)、列表类型、联合类型合起来统一称为简单类型。XML Schema具有低级类型检查能力,允许把元素定义为表5.3中的任何类型之一。赋予简单类型的元素具有字符类型内容,但没有子元素或属性。· 原子类型具有不可分割的值,如10和large · 列表类型的值为用空白符隔开的原子值列表,如<availableSizes>10 large 2</availableSizes> · 联合类型的值可以是原子值,也可以是列表值。它们的区别在于该类型的有效值集
68、是两个或多个其他简单类型值空间的联合。如要对于学生的成绩评定等级,可以定义一个联合类型,它允许的值既可以是0到100的整数,也可以是优、良、合格或不合格。 表5.3 XML Schema支持的部分简单类型内建类型定义string字符串数据,如"online book shop"boolean二元类型的True或者False。date表示日期,格式是CCYY-MM-DD。dateTime表示当前时间,由日期和时间组成,如11/18/80,10:00amtime24小时格式的时间可根据时区调节。decimal任意精度和位数的十进制数,如27.93integer整数,如34flo
69、at标准的32位浮点数,如11.87e-2在前面一些例子中,有几个元素和属性被声明为简单类型。其中一些简单类型如 string 和integer是XML Schema中内置的,其它的一些则是源于(如果使用对象技术的语言就是继承)内置的类型。除此之外,新的简单类型可以通过从现有的简单类型(内置的简单类型以及源于内置简单类型的简单类型)引出定义。通常,通过重新约束一个现存的简单类型来引出一个新的简单类型。换句话说,新类型的合法值范围是现有类型的值范围的子集。使用simpleType元素来定义和命名新的简单类型,使用restriction元素来指出现有的基类型,并且用它来标识约束值范围的细节。 假设
70、希望建立一个新的整数类型称为myInteger,它的值范围为10000到99999。那么定义应当基于简单类型integer,然后定义它的值范围为10000到99999。为了定义myInteger,这样来约束integer的范围,示例如下:<xsd:simpleType name="myInteger"> <xsd:restriction base="xsd:integer"> <x
71、sd:minInclusive value="10000"/> <xsd:maxInclusive value="99999"/> </xsd:restriction></xsd:simpleType> 这个例子显示了由一个基本类型定义和两个值域区间方面描述的组合,通过这三个要素对myInteger实施定义。2. 简单类型命名定义简单类型既可以为命名简单类型又可以为匿名
72、简单类型。命名简单类型总是在全局定义,而且要求在模式的数据类型中具有唯一名称。类型的名称必须为XML无冒号名称,即必须是字母或下划线开始,只能包含字、数字、下划线、连字符和句号。如上面的例子,简单类型名为myInteger。这种类型的模式构造非常直截了当,但有些不实用。特别是如果定义了许多只应用一次而且包含非常少约束的类型,在这种情况下,一个类型应该能够被更简单的定义。这样的简单定义通常的形式是一个节省了名称和外部引用开销的匿名类型。在下面的示例中,publish元素声明使用了匿名类型定义。一般的来说,通过元素中是否包含“type=”这个属性可以判断匿名元素定义(或者是匿名属性定义)。如果出现
73、无名称的类型定义,也可以认为是匿名元素(属性)定义。 <xsd:element name="publish"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="40"/> </xsd:restriction> <
74、;/xsd:simpleType></xsd:element> 3. 简单类型的限制每个简单类型都是从另一个简单类型派生而来,这另一个简单类型称为基类型。派生可以从原子类型,也可以从用户定义的简单类型派生。上面的例子都从内置的原子类型派生成新的简单类型。所有新的简单类型都以某种方式限制其基类型的值空间。下面的例子从上面定义的myInteger类型进一步限制:<xsd:simpleType name="bookInteger"> <xsd:restriction base="xsd
75、:myInteger"> <xsd:minInclusive value="23"/> <xsd:maxInclusive value="2046"/> </xsd:restriction></xsd:simpleType> 简单类型定义时,都是通过re
76、striction元素来定义限制,通过base属性来规定一种基类型。在restriction内,可以以任何顺序指定任何面(facet),来对类型取值进一步限制。根据面的不同,这个元素或属性具有不同的有效值。表5.4是XML Schema面的定义。对每个内置的原子类型,都有一套定义时可用的面。如果某个面适用于某种原子类型,那么也适用于派生于该类型的简单类型。这里有必要举例说明枚举的简单类型定义,下面的例子定义了一个简单类型category,用于说明书籍的类别:<xsd:simpleType name="category">
77、160; <xsd:restriction base="xsd:token"> <xsd:enumeration value="小说"/> <xsd: enumeration value="散文"/> <xsd: enumeration value="传记"/> <xsd: enumeration value="诗歌"/>
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 应急管理部安全培训要求课件
- 贵州省建筑工程计价定额
- 化工安全培训心得体会14篇
- 2026年智能床垫气囊控制系统项目项目建议书
- 2026年腰部按摩仪项目可行性研究报告
- 2026年混合基质膜材料项目建议书
- 2024年上海交通大学马克思主义基本原理概论期末考试笔试题库
- 2026年阿尔茨海默病早期诊断项目评估报告
- 2025年河南推拿职业学院马克思主义基本原理概论期末考试模拟试卷
- 2026年大学讲师职位申请的常见面试问题解析
- 工贸行业消防安全培训
- 旅游饭店星级评定标准与划分解析
- 国学馆展厅设计
- 青少年足球技能等级划分技术规范(男子U7-U12)
- 国开机考答案 管理学基础2025-06-21
- 企业IT顾问兼职聘用合同
- 2025至2030年中国直线模组行业市场现状调研及发展前景预测报告
- DB34-T2328-2015-旅行社研学旅行服务规范-安徽省
- 骨科围手术期静脉血栓栓塞症预防指南
- 中药材入股合同协议书
- 智能化系统在铁路装备检修中的应用-洞察阐释
评论
0/150
提交评论