···························································· 第3 章 chapter3 XMLSchema 本章学习目标 ● 了解XMLSchema的概念和定义内容 ● 掌握XMLSchema的文档结构 ● 掌握XMLSchema的数据类型 ● 掌握XMLSchema的元素定义 ● 掌握XMLSchema的属性定义 ● 熟悉XMLSchema模式重用的方式 本章首先介绍XMLSchema的概念及定义内容,然后详细介绍XMLSchema的文 档结构及使用方法,最后介绍实现XMLSchema模式重用的两种方式。 3.1 XML Schema 概述 XMLSchema是2001年5月正式发布的W3C 推荐标准,现在已成为全球公认的 XML环境下首选的数据建模工具。XMLSchema是Microsoft公司开发的一种定义 XML文档的模式,称为XML模式定义语言———XMLSchemaDefinition,简称XSD。使 用XSD,我们不仅可以描述XML文档的结构以便颁布业务标准还可以使用支持XSD的 通用化XML解析器对XML文档进行解析,并自动地检查其是否满足给定的业务标准。 XMLSchema的优势如下。 (1)XMLSchema基于XML语法。XMLSchema没有专门的语法,它是基于XML 语法进行编写的。使用XML编写XMLSchema有很多优势,如下所示: ● 不必再重新学习新的语言; ● 可以使用XML编辑器来编辑XMLSchema; ● 可以使用XML解析器来解析XMLSchema; ● 可以使用XMLDOM 来处理XMLSchema; 3 4 ◆W eb 服务——基于Java+ XML 的应用 ● 可以通过XSLT来转换XMLSchema。 (2)XMLSchema支持数据类型。XMLSchema最重要的功能之一就是对数据类 型的支持,例如int、float、boolean等,通过对数据类型的支持带来如下优势: ● 可以更容易地描述允许的文档内容; ● 可以更容易地验证数据的正确性; ● 可以更容易地与来自数据库中的数据一并工作; ● 可以更容易地定义数据约束; ● 可以更容易地定义数据模型; ● 可以更容易地在不同的数据类型间转换数据。 (3)XMLSchema可以保护数据通信。当发送方将数据发送到接收方时,双方都应 该有关于内容的相同的“期望值”,通过XMLSchema,发送方可以用一种接收方能够明 白的方式来描述数据。例如“02-04-2018”,在某些国家被解释为2018年4月2日,而在 另一些国家则被当作2018年2月4日。但是对于一个带有数据类型的XML元素,例如 ,2018-02-04,可以确 保对内容一致的理解,这是因为XML的数据类型date要求的是“YYYY-MM-DD”格式。 (4)XMLSchema是可扩展的。由于XMLSchema是由XML编写的,因此XML Schema是可扩展的。通过可扩展的XMLSchema 定义,开发者可以在其他XML Schema文档中重复使用自己的XMLSchema,创建由标准数据类型派生出来的自己的 数据类型,在相同的文档中引用多重的XMLSchema文档。 (5)XMLSchema支持综合命名空间。 (6)XMLSchema支持属性组。 3.2 XML Schema 语法简介 3.2.1 XMLSchema文档结构 XMLSchema本身是一个XML 文档,它符合XML 语法结构,可以使用通用的 XML解析器进行解析。一个XML文档引用一个XMLSchema文档,该XMLSchema 文档定义了一个模式,遵循某个特定XMLSchema模式的XML文档称为XMLSchema 的一个实例文档。 【例3.1】 创建一个XMLSchema文档,然后创建一个该文档的实例文档。 (1)首先创建一个XMLSchema文档,并且命名为student.xsd,代码内容如下: 第◆3 章 XML Schema 3 5 通过上述实例可以看出XMLSchema自身就是一个XML文档。XMLSchema是 用一套预先规定的XML元素和属性创建的,这些元素和属性定义了文档的结构和内容 模式。元素是每一个XMLSchema的根元素,其一般形式如下: 其中, ● xmlns:xs="http://www.wxxx3.org/2001/XMLSchema"指出schema中用到的 来自命名空间"http://www.wxxx3.org/2001/XMLSchema"的元素和数据类型 应该使用前缀xs; ● targetNamespace="http://www.mxxxb.com"指出本文档定义的元素、属性、类 型等名称属于"http://www.mxxxb.com"命名空间; ● xmlns="http://www.mxxxb.com "指出默认的命名空间是"http://www. myweb.com"; ● elementFormDefault="qualified"指出任何XML 实例文档所使用的且在此 schema中声明过的元素必须被命名空间限定。 (2)创建XMLSchema的一个实例文档,名称为student.xml,在这个文档中引用 XMLSchema文档,代码内容如下所示: tom 20 1999-03-25 87.8 3 6 ◆W eb 服务——基于Java+ XML 的应用 要验证XML文档,必须指定Schema文档的位置。Schema文档的位置可以利用带 有名称空间模式的xsi:schemaLocation 属性以及不带名称空间模式的xsi: noNamespaceSchemaLocation属性来指定。 当Schema文档包括targetNamespace属性时,应当通过XML 文档根元素的xsi: schemaLocation属性来引用Schema文档,这个属性值包括由空格分开的两部分,前一部 分是URI,这个URI与Schema文档的targetNamespace属性的URI是一致的;后一部 分是Schema文档的完整路径及名称。另外,XML文档的根元素也必须声明Schema文 档的名称空间(xmlns:xs="http://www.wxxx3.org/2001/XMLSchema)来引用XML Schema文档,文档代码如上例所示。 当Schema文档不包括targetNamespace属性时,应当通过XML文档根元素的xsi: noNamespaceSchemaLocation属性及W3C 的Schema文档的名称空间(xmlns:xs= "http://www.wxxx3.org/2001/XMLSchema)来引用XMLSchema文档,针对上面的实 例代码修改如下: Tom male 19 88889999 3.2.2 XMLSchema元素的声明 1.根元素 XMLSchema文档必须要定义一个且只能定义一个根元素。 根元素不但表明了文档类型,而且还包括了模式的约束、XML模式名称空间的定义、其 他名称空间的定义等一些其他属性信息。其定义格式如下: 2.元素 在W3CXMLSchema中,元素通过使用元素实现。元素声明用于给元 素指定元素名称、元素内容和元素数据类型等属性。元素声明的基本语法如下所示: 第◆3 章 XML Schema 3 7 其中, ● name指定要声明的元素的名称; ● type指定该元素的数据类型; ● default指定该元素的缺省值,此项可选; ● ref指定使用引用的元素的名称,此项可选; ● minOccurs指定该元素在XML文档中可以出现的最小次数,默认为1,它的值是 一个大于或等于0的整数,此项可选; ● maxOccurs指定该元素在XML文档中可以出现的最大次数,默认为1,它的值是 一个大于或等于0的整数,可以将属性的值设置为unbounded,表示对该元素出现 的最多次数没有限制,此项可选。 3.2.3 XMLSchema数据类型 XMLSchema中的数据类型分为简单类型、复合类型和匿名类型。简单类型的元素 是只能包含文本,但不能包含子元素或属性的元素;复合类型的元素是可以含有子元素 或属性的元素;匿名类型在定义元素时,不必写type属性,即可以通过元素中是否包含 type属性判断是否为匿名元素。 1.简单类型 XMLSchema规范中定义了两类简单类型:内置类型和用户定义类型。 (1)内置数据类型 XMLSchema中的内置数据类型,包括原始数据类型和派生数据类型,这些类型是 在XMLSchema中使用的每种数据类型的最基本构成块,可以用它们来描述元素的内容 和属性值,也可以根据这些类型构造自定义类型。XMLSchema支持的常用内置数据类 型如表3.1所示。 表3.1 内置数据类型 数据类型描 述示 例 string XML中任何合法的字符串JohnSmith boolean 逻辑判断,true和false true、false number 表示任意精度的十进制数,可使用缩写-1.52,45,1.2E2 float 单精度浮点数123.456 3 8 ◆W eb 服务——基于Java+ XML 的应用 续表 数据类型描 述示 例 double 双精度浮点数123.456 decimal 表示任意精度的十进制数123456 long 表示-263~+263-1的整数值123456 int 表示-231~+231-1的整数值123456 nonNegativeInteger 表示大于或等于0的整数123 positiveInteger 表示一个大于0的整数123 dateTime 表示格式为YYYY-MM-DDThh:mm:ss的日期时间2017-09-03T16:21:45 time 表示hh:mm:ss格式的时间16:21:45 date 表示YYYY-MM-DD格式的日期2017-09-03 (2)用户定义类型 除了上述内置数据类型之外,还有一类简单数据类型是用户自定义类型。这种数据 类型是编写模式文档的用户对内置类型或其他用户自定义类型加以限制或扩展而生成 的。用户自定义类型使用元素定义,其语法如下所示: 自定义数据类型的内容模式 其中restriction用于为XML元素或属性定义可接受的值,其可以使用的子元素及 其含义如表3.2所示。 表3.2 restriction元素的常用子元素 元素名称描 述 enumeration 在指定的数据集中选择,限定用户的选值 fractionDigits 限定最大的小数位,用于控制精度 length 指定数据的长度 maxExclusive 指定数据的最大值(小于) maxInclusive 指定数据的最大值(小于或等于) maxLength 指定长度的最大值 minExclusive 指定数据的最小值(大于) minInclusive 指定数据的最小值(大于或等于) minLength 指定长度的最小值 pattern 指定限定数据的正则表达式 第◆3 章 XML Schema 3 9 例如,记录电话号码的标签格式为:0536-7778888,此标 签中的内容要求只能容纳12个字符长度的字符串值,并且匹配模式dddd-ddddddd(d表 示0~9的数字),针对phoneno元素的自定义数据类型如下: 正则表达式\d{4}-\d{7}的语义为:4个数字后面是一个连字符,接着是7个数字。 注意:正则表达式的详细介绍超出了本书的范围,感兴趣的读者可以参阅相关的图 书或资料。 下述代码片段将名为age的数据类型的值设定在16~30: 下述代码片段将名为sex的数据类型的值设定为只能是male或female: 2.复合类型 复合类型的元素是可以含有子元素或属性的元素。为了声明复合元素,应当首先定 义一个复合数据类型,然后通过使该类型与元素相关联来声明复合元素。复合数据类型 的声明语法如下所示: 在XML模式中,可以将相关的元素结合为组。Schema提供了能够用来组合用户定 义的元素,常用的元素有以下几个。 (1)元素 元素要求组中的元素必须按照模式中指定的顺序显示。其语法格式如 4 0 ◆W eb 服务——基于Java+ XML 的应用 下所示: 其中, ● id规定该元素的唯一的ID,该项可选; ● minOccurs规定元素在父元素中可以出现的最小次数,该值可以是大于或等于0 的整数,若设置为0则表示该组是可选的,缺省值为1,该项可选。 ● maxOccurs规定元素在父元素中可以出现的最大次数,该值可以是大于或等于0 的整数,若设置为unbounded则表示不限制最大次数,缺省值为1;该项可选。 例如: 根据上述代码的定义,XML 文档中的 元素可以包含0 个或多个 元素和元素,并且要按照先的顺 序出现。如果元素的顺序不符合它们在sequence声明中的顺序时,验证器会进行报错。 需要注意的是上述代码中的minOccurs和maxOccurs限定的是复合类型整体出现 的次数,也就是如图3.1所示的XML文档是有效的。 图3.1 有效的XML文档演示 第◆3 章 XML Schema 4 1 如图3.2所示的XML文档则是无效的。 图3.2 无效的XML文档演示 (2)元素 元素允许唯一的一个元素从声明组中被选择。其语法格式如 下所示: 其中, ● id规定该元素的唯一的ID。该项可选; ● minOccurs规定元素在父元素中可以出现的最小次数,该值可以是大于或等于0 的整数,若设置为0则表示该组是可选的,缺省值为1。该项可选; ● maxOccurs规定元素在父元素中可以出现的最大次数,该值可以是大于或等于0 的整数,若设置为unbounded则表示不限制最大次数,缺省值为1。该项可选。 例如: 根据上述代码的定义,XML 文档中的 元素必须且只能包含一个 元素或一个元素,否则,验证器会进行报错。 4 2 ◆W eb 服务——基于Java+ XML 的应用 如图3.3所示的XML文档是有效的。 图3.3 有效的XML文档演示 如图3.4所示的XML文档是无效的。 图3.4 无效的XML文档演示 (3)元素 元素规定子元素能够以任意顺序出现,每个元素可以出现0次或1次,而且 每次最多显示一次。其语法格式如下所示: 其中, ● id规定该元素的唯一的ID,该项可选; ● minOccurs规定元素在父元素中可出现的最小次数,该值可以是0或1,若设置为 0则表示该组是可选的,缺省值为1,该项可选; 第◆3 章 XML Schema 4 3 ● maxOccurs规定元素在父元素中可出现的最大次数,该值必须是1。该项可选。 例如: 根据上述代码的定义,在XML文档中元素和元素能够以 任何顺序出现,两个元素都必须且只能出现一次,否则,验证器会进行报错。 如图3.5所示的XML文档是有效的。 图3.5 有效的XML文档演示 如图3.6所示的XML文档是无效的。 图3.6 无效的XML文档演示 4 4 ◆W eb 服务——基于Java+ XML 的应用 【例3.2】 根据给定XML 文档(student.xml)以及相关要求创建相应的XML Schema文档(student.xsd)。 Tom male 19 0536-8888777 此文档中元素元素:元素、元素和元素的取 值需满足如下要求: ● 是简单类型的元素; ● 元素和元素的值必须是字符串; ● 元素的取值只能是male和female; ● 元素的值必须是16~30的整数; ● 元素允许的组合:11位手机号、3位区号-8位号码、4位区号-8位号 码、4位区号-7位号码。 针对上述要求,该XML的完整模式文档定义如下。 第◆3 章 XML Schema 4 5 在上述定义中,由于XML文档元素为复合类型,故在Schema中为其指 定类型时需要使用复合类型。studentDef是按照XML文档结构定义的复合数据类型, 被通过的type属性指定为元素的数据类型。 将元素的数据类型都扩展为用户自定义数据类型, 并分别命名为ageType、sexType和phonenoType,此种形式可以方便地实现数据类型 共用。 3.匿名类型 使用XMLSchema,可以定义一系列具有名称的数据类型,通过使用元素的type属 性来引用这些数据类型。这种类型的模式构造非常直观,可以方便地实现数据类型复 用,但在有些情况下不是很实用。例如,在模式文档中定义了许多只应用一次并且包含 非常少的约束的数据类型,使用上文介绍的方法模式,文档就会变得非常烦琐。对于此 类情况,可以使用一种新的定义方式———匿名类型定义。 使用匿名类型定义时元素声明不必再写type属性,因为匿名类型定义在某个元素的 内部,为该元素专用。 【例3.3】 使用匿名类型定义实现例3.2的要求,定义一个XMLSchema文档。 4 6 ◆W eb 服务——基于Java+ XML 的应用 3.2.4 XMLSchema属性声明 属性声明用于命名属性并指定属性值的类型。在Schema中实现的方法是使用 Attribute标记,可以按照定义元素的方式定义属性,但受限制的程度更高。它们只能是 简单类型,只能包含文本,且没有子属性;属性是没有顺序的,而元素是有顺序的。其语 法格式如下所示: 其中, ● name用来指定自定义属性名称; ● default用来指定自定义属性的一个缺省值,该项可选; ● fixed用来为自定义属性提供一个固定的值,且不能和default属性同时出现,该项 可选; ● type指定该属性的数据类型,此处只能是简单数据类型; 第◆3 章 XML Schema 4 7 ● use指定该属性值是required(必需)还是optional(可选的),默认为optional。 注意:要把属性附加在元素上,属性应该在complexType定义过程中最后进行 定义。例 如,下面代码显示了给元素增加一个no(学号)属性的方法: < xs: attribute name =" no " type =" xs: string " use =" required " > 3.3 模式重用 XMLSchema支持高度重用性,即在一个模式中声明的组件能够被另一个模式重 用。XMLSchema推荐标准中提供了元素和元素来实现模式的 重用。 1.元素 元素用于向一个文档添加带有相同目标命名空间的多个XMLSchema 文档。其语法格式如下: 其中, ● id用来指定元素的ID,ID必须是唯一的,该项可选; ● schemaLocation指定所要包含的XMLSchema文档的URI。 元素在一个xsd文档中可以多次出现。元素是 元素的父元素。在使用元素时,唯一要注意的事情是:要包含和已包含的模 式文件必须属于同一个目标命名空间,如果schema目标命名空间不匹配,则包含不会 有效。 【例3.4】 定义一个XMLSchema文档,演示如何使用元素实现模式 重用。定 义第一个模式文件first.xsd,内容如下: 4 8 ◆W eb 服务——基于Java+ XML 的应用 定义第二个模式文件second.xsd,内容如下: 定义第三个模式文件third.xsd,内容如下: 第◆3 章 XML Schema 4 9 在third.xsd模式文件中使用了前面两个模式文件中所定义的用户自定义的简单数 据类型,并且它们位于同一个目标命名空间:targetNamespace="http://www.mxxxb. com"。对于命名空间"http://www.mxxxb.com"中定义的类型的引用不需要加前缀,因 为此命名空间使用的是默认引用的方式;对于命名空间"http://www.wxxx3.org/2001/ XMLSchema"中定义的类型的引用必须加上前缀xs。 2.元素 元素和元素具有同样的功能,但元素允许访问来 自多个不同目标名称空间的模式的组件。其语法格式如下: 其中, ● id用来指定元素的ID,ID必须是唯一的,该项可选; ● namespace指定被引入模式所属的命名空间URI,它也指定前缀,该前缀用来使一 个元素或属性和一个特定的命名空间相关联; ● schemaLocation指定模式文件的物理地址。 【例3.5】 定义一个XMLSchema文档,演示如何使用元素实现模式 重用。定 义第一个模式文件first_i.xsd,该XSD 文件对于命名空间使用默认方式,目标命 名空间:targetNamespace="http://www.xxx.com",内容如下所示: 定义第二个模式文件second_i.xsd,该XSD 文件对于命名空间使用默认方式,目标 命名空间:targetNamespace="http://www.xxxd.com",内容如下所示: 5 0 ◆W eb 服务——基于Java+ XML 的应用 定义第三个模式文件third_i.xsd,该XSD 文件目标命名空间targetNamespace= "http://www.xxxd.com",内容如下所示: 在third_i.xsd模式文件中使用了前面两个模式文件中所定义的用户自定义的简单 数据类型,因为它们并不位于同一个目标命名空间,所以需要借助于元素将 其他目标命名空间中的模式文件引入当前的模式文件中。 对于命名空间"http://www.xxxt.com"中所定义的类型的引用必须加上前缀prd1; 对于命名空间"http://www.xxxd.com"中所定义的类型的引用必须加上前缀prd2;对于 第◆3 章 XML Schema 5 1 命名空间"http://www.wxxx3.org/2001/XMLSchema"中所定义的类型的引用必须加 上前缀xs;而对于命名空间"http://www.mxxxb.com"中所定义的类型的引用就不需要 加前缀了,因为此命名空间使用的是默认引用的方式。 3.4 XML Schema 应用实例 【例3.6】 对于下列XML文档: order.xml 玩具 16 上海 200000 13577778888 文具 20 青岛 266000 0532-77778888 创建一个Schema文档,并应用于给定的XML文档。要求如下: ● 元素在XML文档中可以出现多次,但至少要求出现一次; ● 元素值的格式必须是AXXX,其中X为0~9的数字,为必选项; ● 元素的值为1~999; ● 元素的内容的格式必须是XXXXXX,其中X为0~9的数字,该元素可选; ● 元素允许如下组合:11位手机号、3位区号+8位号码、4位区号+8 位号码、4位区号+7位号码。 1.建立XMLSchema文档 (1)单击File|New按钮,在弹出的对话框中选择W3CXMLSchema选项。 (2)首先定义XML文档的根元素,该元素拥有两个子元素,因 此将它认定为复合类型元素,并且可以被元素修饰,用作定义子元素出现的 次数。其次元素拥有两个属性和若个干子元素,因此也将它认定为复合类型元 素,并且用元素修饰,用作定义子元素的出现顺序。、 5 2 ◆W eb 服务——基于Java+ XML 的应用 这几个元素只包含文本信息,因此可以将其定义为简单类型元素。 相关代码如下所示: order.xsd