《XML案例教程》课件第4章_第1页
《XML案例教程》课件第4章_第2页
《XML案例教程》课件第4章_第3页
《XML案例教程》课件第4章_第4页
《XML案例教程》课件第4章_第5页
已阅读5页,还剩185页未读 继续免费阅读

下载本文档

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

文档简介

第4章XML与W3CXMLSchema模式4.1XMLSchema简介4.2XMLSchema的常用内置简单类型4.3XMLSchema声明简单类型4.4XMLSchema声明复杂类型4.5XMLSchema的名称空间4.6综合实例4.7本章小结习题44.1XMLSchema简介

通过第2章和第3章的学习,我们知道XML文档有结构良好和有效性两种约束。格式良好适合于所有的XML文档,即满足XML标准中对于格式的规定,而当XML文档满足一定的语义约束时则称该XML文档为有效的XML文档。目前常用的XML检查有效性的语言有DTD、XDR和XSD。

1.DTD

第3章描述的DTD文档类型定义使用不同于XML的独立语法来规定了XML文档中各种元素的内容模式,该语言直接沿袭了定义SGML语言的方法。

2.XDR

XDR的全称是XML-DataReducedLanguage,是早先由XML-Data草案派生出来的一个定义XML语言的分支。微软最先提出了XML-Data,并且经过修订后在微软的应用软件中大量使用。

3.XSD

最为正式的XMLSchema语言是由W3C指定的XMLSchema规范,简称XSD(XMLSchemaDefinition)。XSD也提供了数据类型的支持和结构定义的方法。

2001年5月2日,XMLSchema规范成为了W3C的正式推荐标准。这就意味着经过三年多的发展,XML的Schema标准终于成为业界统一认可的规范。伴随着XML、XMLSchema和Namespace相继成为W3C的正式标准,意味着XML语法规范已经奠定了扎实的基础,XML的广泛发展和应用也即将成为现实。4.1.1Schema的本质

Schema文档实际上是一个以 .xsd为后缀的文本文件。例4-1的案例给出了一个简单的Schema文档,通过这个案例可以对Schema有一个直观的认识。【例4-1】

案例说明:一个简单的Schema实例。

程序名称:ch4-1.xsd

01<?xmlversion="1.0"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="PersonName"type="xsd:string"/>

04</xsd:schema>案例分析:程序ch4-1.xsd给出了一个由四行代码写出的Schema文档。对上述代码的分析如下:

第01行代码<?xmlversion=“1.0”?>在第2章的2.2节中已经学习过,该代码为XML文档声明,说明该文档为一个XML文档。

第02行及第04行代码是一个元素的定义<xsd:schema>和</xsd:schema>,该元素是整个文档的唯一根元素,在第2章的2.3.4节中有根元素的详细说明。第02行根元素后面紧跟的代码xmlns:xsd=“http:///2001/XMLSchema”则定义了一个xsd的命名空间,在第2章的2.4.1节和2.4.2节中有关于命名空间的详细说明。

第03行代码是<xsd:schema>的子元素<xsd:element>,该元素有两个属性:type和name。在第2章的2.3.5节和2.3.6节中给出了属性和元素嵌套的详细说明。

通过上述对例4-1的Schema文档代码的分析,可以看出该文档的结构性很强,而且完全符合XML文档的语法规范,这就是Schema的本质——XML文档。4.1.2使用Schema的原因

已经有了DTD文档来验证XML文档的有效性,为什么还要使用Schema来验证呢?下面通过实例来说明其原因。例4-2和例4-3给出的两个案例分别使用Schema和DTD验证了同一个XML文档,这个XML文档的根元素为PersonName,三个子元素为FullName、FirstName和LastName。【例4-2】

案例说明:使用Schema验证XML文档的实例。

程序名称:ch4-2.xsd

01<?xmlversion="1.0">

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="PersonName">

04<xsd:complexType>

05<xsd:sequence>06<xsd:elementname="FullName"type="xsd:string"/>

07<xsd:elementname="FirstName"type="xsd:string"/>

08<xsd:elementname="LastName"type="xsd:string"/>

09</xsd:sequence>

10</xsd:complexType>

11</xsd:element>

12</xsd:schema>程序名称:ch4-2.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<PersonNamexmlns:xsi="/2001

/XMLSchema-instance"xsi:noNamespaceSchema

Location="ch4-2.xsd">

03<FullName>楼桦</FullName>

04<FirstName>楼</FirstName>

05<LastName>桦</LastName>

06</PersonName>【例4-3】

案例说明:使用DTD验证XML文档的实例。

程序名称:ch4-3.dtd

01<?xmlversion="1.0"encoding="utf-8"?>

02<!ELEMENTFullName(#PCDATA)>

03<!ELEMENTFirstName(#PCDATA)>

04<!ELEMENTLastName(#PCDATA)>

05<!ELEMENTPersonName(FullName,FirstName,LastName)>程序名称:ch4-3.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<!DOCTYPEPersonNameSYSTEM"ch4-3.dtd">

03<PersonName>

04<FullName>楼桦</FullName>

05<FirstName>楼</FirstName>

06<LastName>桦</LastName>

07</PersonName>案例分析:直接理解例4-2中的Schema是有困难的,但通过直观的代码观察和分析即可得出Schema和DTD两种不同定义方法的区别。

(1)由于Schema是一个规范的XML文档,因此它继承了XML文档结构性强的特点,各个元素的嵌套关系非常直观。而DTD文档的结构是平面化的,可以想象,使用DTD在定义嵌套关系复杂的XML文档时,很难把握各个元素之间的层次和嵌套关系。

(2)例4-2中的Schema代码第05行至第07行在定义三个子元素时使用了type属性即type=“xsd:string”,其中string类型直观地表达了子元素是字符串类型的信息。例4-3中的DTD只能表示子元素含有文本,不能再嵌套子元素,对于文本的具体类型,DTD无法更加精确地进行定义。

(3) Schema本质就是XML文档,而DTD不是XML文档。用XML文档来定义XML文档对于理解Schema文档和构造解析器方面具有非常大的优势。上述两个案例提供的信息表达的Schema相对于DTD的优势远不止这些,目前在许多XML的应用和开发领域,DTD逐渐呈现颓势(DTD目前仍然可以胜任定义某些简单XML文档的工作)。Schema作为主流的XML模式,已经是一种必然的趋势。4.1.3使用Schema验证XML文档

下面再来分析一下例4-2中案例包含的两个文档,观察一下Schema(程序ch4-2.xsd)是如何验证XML文档(程序ch4-2.xml)的。

1.Schema文档

(1)第01行代码<?xmlversion=“1.0”>是XML文档声明,Schema在本质上是一个XML文档。

(2)第02行代码<xsd:schemaxmlns:xsd=“http://www.w3.org/2001/XMLSchema">和第12行代码</xsd:schema>定义了整个Schema文档的根元素,所有元素和属性的声明都必须包含在根元素<xsd:schema>中。命名空间“http://www./2001/XMLSchema”由W3C提供,该案例中将这个命名空间绑定在前缀“xsd”上,在该文档中出现的以“xsd”为前缀的元素,都是“/2001/XMLSchema”的一员。本章中的所有案例都将W3C提供的命名空间“/2001/XMLSchema”绑定在前缀“xsd”上。

(3)第03行代码<xsd:elementname=“PersonName”>和第11行代码</xsd:element>定义了XML文档的根元素。元素<xsd:element>也是命名空间“xsd”中的一员,用于声明一个元素。name属性表示被声明的元素的名称是“PersonName”。

(4)第04行、05行、09行和第10行代码均为定义根元素<xsd:elementname=“PersonName”>类型的语句,这些代码将在4.4节中给出详细的说明。

(5)第06行至第08行代码定义了XML文档根元素的三个子元素FullName、FirstName和LastName,并且在type属性中定义了子元素的数据类型为string字符串类型。

2.XML文档

(1)该文档与第2章讲述的XML文档的不同之处在于根元素的第02行代码:

<PersonNamexmlns:xsi=“/2001

/XMLSchema-instance”

xsi:noNamespaceSchemaLocation=“ch4-2.xsd”>

(2)“/2001/XMLSchema-instance”是W3C提供的另一个特殊的命名空间,该命名空间中的元素和属性主要用来将XML文档与Schema文档关联起来。

(3)“xsi:noNamespaceSchemaLocation”用来定义Schema文件的路径。由于Schema验证Schema文档(ch4-2.xsd)和XML文档(ch4-2.xml)在同一个文件夹下,这里使用的是相对路径“ch4-2.xsd”,本章涉及的所有案例中的Schema文档和XML文档都位于同一个目录下,全部使用相对路径。如果验证文档使用绝对路径,则可以写为“file:///e:/xsd/4-2.xsd”,表示验证文档位于E盘的xsd文件夹下,文件名为“4-2.xsd”。

4.2XMLSchema的常用内置简单类型

W3CSchema中定义了44种内置数据类型,本节将对其中经常使用的七种类型进行说明。这七种类型分别是:字符串型、小数型、整数型、布尔型、日期型、时间型和日期时间型。本节中说明未涉及的类型可以查阅W3C的Schema语法说明。4.2.1字符串(string)型

字符串类型是几乎每个高级编程语言中变量和数据库字段的类型定义中的一种,这个数据类型用于定义XML文档中元素或者属性的数据内容为一个字符串,使用“xsd:string”进行定义。例4-4给出的案例说明了如何定义一个字符串类型的图书名称元素。【例4-4】

案例说明:使用Schema定义字符串类型的元素。

程序名称:ch4-4.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="BookName"type="xsd:string"/>

04</xsd:schema>程序名称:ch4-4.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<BookNamexmlns:xsi="/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-4.xsd">

03XML学习指南

04</BookName>实际上,所有的元素和属性的数据类型都可以是字符串类型,就像DTD中定义的数据类型PCDATA一样,是数据类型中最松散的约束,其唯一要求是不能含有特殊字符(如“&”、“>”等2.5节中预定义实体表示的字符)。4.2.2小数(decimal)型

十进制的小数使用也非常普遍,使用“xsd:decimal”进行定义。小数类型的数据内容可以加上正负号,分别表示正数和负数。例4-5给出的案例说明了如何定义一个小数类型的图书价格元素。【例4-5】

案例说明:使用Schema定义小数类型的元素。

程序名称:ch4-5.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="BookPrice"type="xsd:decimal"/>

04</xsd:schema>程序名称:ch4-5.xml

01<?xmlversion=“1.0”encoding=“utf-8”?>

02<BookPricexmlns:xsi=“/2001

/XMLSchema-instance”

xsi:noNamespaceSchemaLocation=“ch4-5.xsd”>

0346.50

04</BookPrice>

小数类型最多可以指定18位小数,定义浮点类型使用“xsd:float”,定义双精度浮点类型使用“xsd:double”。4.2.3整数(integer)型

整数类型使用“xsd:integer”进行定义,整数类型的数据内容也可以加上正负号,分别表示正整数和负整数。如果XML文档中元素的数据内容是整数类型而定义该元素的是小数类型,则有效性校验是可以通过的;如果XML文档中元素的数据内容是小数类型(如12.3)而定义该元素的是整数类型,则有效性校验无法通过。例4-6给出的案例说明了如何定义一个整数类型的图书数量元素。【例4-6】

案例说明:使用Schema定义整数类型的元素。

程序名称:ch4-6.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001

/XMLSchema">

03<xsd:elementname="BookNumber"type="xsd:integer"/>

04</xsd:schema>程序名称:ch4-6.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<BookNumberxmlns:xsi="/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-6.xsd">

03400

04</BookNumber>“xsd:integer”包含了所有的整数,下面是四个整数类型的子类型定义:

“xsd:positiveInteger”——正整数定义,即1、2、3、4…;

“xsd:negativeInteger”——负整数定义,即 -1、-2、-3、-4…;

“xsd:nonNegativeInteger”——非负整数定义,即0、1、2、3、4…;

“xsd:nonPositiveInteger”——非正整数定义,即0、-1、-2、-3、-4…。

例4-6中的图书数量元素如果表示库存数量,则使用“xsd:nonNegativeInteger”来进行类型定义约束性会更强,因为库存的图书数量不可能出现负整数。4.2.4布尔(boolean)型

布尔类型使用“xsd:boolean”进行定义,该类型定义的元素一般只包含两种状态,如是或否、真或假、正或负等。使用该数据类型定义的元素数据内容可以有两组:“true”或“false”、“0”或“1”。“0”通常用来表示“false”;“1”通常用来表示“true”。例4-7给出的案例说明了如何定义一个布尔类型的图书是否售完的元素。【例4-7】

案例说明:使用Schema定义布尔类型的元素。

程序名称:ch4-7.xsd

01<?xmlversion=“1.0”encoding=“utf-8”?>

02<xsd:schemaxmlns:xsd=“/2001

/XMLSchema">

03<xsd:elementname="Sellout"type="xsd:boolean"/>

04</xsd:schema>程序名称:ch4-7.xml

01<?xmlversion=“1.0”encoding=“utf-8”?>

02<Selloutxmlns:xsi=“/2001

/XMLSchema-instance”

xsi:noNamespaceSchemaLocation=“ch4-7.xsd”>

03false

04</Sellout>

案例分析:因为Schema的本质是XML文档,所以字母大小写含义是不同的。程序ch4-7.xml中元素<Sellout>取值如果是“False”或者“FALSE”,是无法通过有效性校验的。4.2.5日期(date)型

日期类型使用“xsd:date”进行定义,日期类型的格式为YYYY-MM-DD,其中YYYY表示年份,MM表示月份,DD表示日。该类型定义的元素数据内容如果表达“2008年2月5日”应该为“2008-02-05”,如果数据内容为“2008-2-5”将无法通过有效性验证。例4-8给出的案例说明了如何定义一个日期类型的图书出版日期元素。【例4-8】

案例说明:使用Schema定义日期类型的元素。

程序名称:ch4-8.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="PublishDate"type="xsd:date"/>

04</xsd:schema>程序名称:ch4-8.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<PublishDatexmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-8.xsd">

032008-06-18

04</PublishDate>4.2.6时间(time)型

时间类型使用“xsd:time”进行定义,时间类型的格式为hh:mm:ss,其中hh表示小时,mm表示分钟,ss表示秒。该类型定义的元素数据内容如果表达“20点6分8秒”应该为“20:06:08”,如果数据内容为“20:6:8”将无法通过有效性验证。例4-9给出的案例说明了如何定义一个时间类型的检查时间元素。【例4-9】

案例说明:使用Schema定义时间类型的元素。

程序名称:ch4-9.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001

/XMLSchema">

03<xsd:elementname="CheckTime"type="xsd:time"/>

04</xsd:schema>程序名称:ch4-9.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<CheckTimexmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-9.xsd">

0314:48:25

04</CheckTime>4.2.7日期时间(dateTime)型

日期时间类型使用“xsd:dateTime”进行定义,日期时间类型的格式为YYYY-MM-DDThh:mm:ss,其中大写的“T”是日期与时间的分隔符,不能缺少。例4-10给出的案例说明了如何定义一个日期时间类型的入库时间元素。【例4-10】

案例说明:使用Schema定义时间日期类型的元素。

程序名称:ch4-10.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="InstoreDateTime"type="xsd:dateTime"/>

04</xsd:schema>程序名称:ch4-10.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<InstoreDateTimexmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-10.xsd">

032008-07-12T15:30:00

04</InstoreDateTime>

4.3XMLSchema声明简单类型

XMLSchema的定义过程就是声明XML文档元素的过程。XML文档元素分为两大类:简单元素和复杂元素。简单元素是指只含有文本内容,不含有子元素和属性的元素。复杂元素是指除简单元素以外的元素。对应这两种XML文档的元素,Schema中也相应地存在两种类型,即简单类型和复杂类型。其中简单类型又分为内置简单类型(本章4.2节中案例使用的所有类型)和自定义简单类型。自定义数据类型都是直接或者间接由内置简单类型衍生出来的,自定义数据类型可以理解为施加了特定约束的内置简单类型。对内置简单类型施加约束,这个要求是从具体的应用需求中产生的。例如定义一个人的年龄的元素,元素的数据类型仅有正整数定义(xsd:positiveInteger)是不够的,因为人的年龄不可能达到200岁,所以要施加正整数的上限200,这个上限(200)就是施加在正整数类型(xsd:positiveInteger)上的约束。相似的例子还有百分制的考试成绩(非负整数类型,约束为大于等于0小于等于100)、中国人名(字符串类型,约束为最少两个汉字最多四个汉字)、货币表示(小数类型,约束为保留两位小数)等。4.3.1限制字符串的长度

限制字符串的长度采用<xsd:minLengthvalue="***"/>指定最小长度,采用<xsd:maxLengthvalue="***"/>指定最大长度。例4-11的案例给出了一个定义图书作者名称元素类型的Schema文档。

【例4-11】

案例说明:使用Schema定义一个具有字符串长度的限制的简单类型,由字符串类型派生。

程序名称:ch4-11.xsd

01<?xmlversion=“1.0”?>

02<xsd:schemaxmlns:xsd=“/2001

/XMLSchema”>

03<xsd:elementname=“PersonName”>

04<xsd:simpleType>05<xsd:restrictionbase="xsd:string">

06<xsd:minLengthvalue="2"/>

07<xsd:maxLengthvalue="4"/>

08</xsd:restriction>

09</xsd:simpleType>

10</xsd:element>

11</xsd:schema>程序名称:ch4-11.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<PersonNamexmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-11.xsd">

03楼桦

04</PersonName>

案例分析:Schema文档ch4-11.xsd中的第04行代码块<xsd:simpleType>表示声明一个自定义简单类型。该声明简单类型定义紧跟在第03行代码<xsd:elementname="PersonName">之后,表明声明的是XML文档中元素<PersonName>的数据内容类型。

Schema文档ch4-11.xsd中的第05行代码<xsd:restrictionbase=“xsd:string”>说明新类型是一个基于xsd:string类型的约束。

Schema文档ch4-11.xsd中的第06行代码<xsd:minLengthvalue=“2”/>中使用关键字“minLength”来限定字符串的最小长度,最小长度的值由“value”属性的值“2”指定。

Schema文档ch4-11.xsd中的第07行代码<xsd:maxLengthvalue=“4”/>中使用关键字“maxLength”来限定字符串的最大长度,最大长度的值由“value”属性的值“4”指定。

在字符串中,无论是中文字符还是英文字符,都被当做一个字符来看待。例4-11中的程序ch4-11.xsd第04行至第09行代码块定义了第03行声明的元素<xsd:elementname="PersonName">,这个代码块将自定义类型声明与元素声明进行了嵌套,Schema文档复杂时会导致代码的可读性和重用性下降。所以一般都采用元素声明和类型声明隔离的方法进行代码的编写。程序ch4-11.xsd可以改写为如程序ch4-11-1.xsd所示的代码:程序名称:ch4-11-1.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="PersonName"type="AuthorNameType"/>04<xsd:simpleTypename="AuthorNameType">

05<xsd:restrictionbase="xsd:string">

06<xsd:minLengthvalue="2"/>

07<xsd:maxLengthvalue="4"/>

08</xsd:restriction>

09</xsd:simpleType>

10</xsd:schema>案例分析:程序ch4-11-1.xsd的第04行至第09行代码块依然声明了一个简单类型,但是和源Schema文档ch4-11.xsd不同的是,首先将声明简单类型的代码块从<xsd:element>中取出,该代码块成为<xsd:schema>元素的子元素。

程序ch4-11-1.xsd的第04行元素<xsd:simpleType>在声明简单类型的语句中加入了属性“name”的值来定义声明简单类型的名称,上面程序的第04行至第09行代码块声明的简单类型名称为“AuthorNameType”。程序ch4-11-1.xsd的第03行代码中将声明元素<xsd:elementname=“PersonName”>的数据内容类型用属性“type”的值“AuthorNameType”定义为第04行~09行代码块声明的简单类型。

本章所提供的案例中Schema文档类型声明的代码编写方式一律采用程序ch4-11-1.xsd的类型声明方式书写。4.3.2限制数值的取值范围

限制数值的取值范围采用<xsd:minInclusivevalue="***"/>指定临界最小值,采用<xsd:max-Inclusivevalue="***"/>指定临界最大值,使用这两个关键字声明的取值范围包括边界值。例4-12的案例给出了一个定义图书价格元素类型的Schema文档。

【例4-12】

案例说明:使用Schema定义一个具有取值范围限制的简单类型,由小数类型派生。

程序名称:ch4-12.xsd

01<?xmlversion=“1.0”encoding=“utf-8”?>

02<xsd:schemaxmlns:xsd=“/2001/XMLSchema”>

03<xsd:elementname=“BookPrice”type=“PriceType”/>

04<xsd:simpleTypename="PriceType">05<xsd:restrictionbase="xsd:decimal">

06<xsd:minExclusivevalue="0"/>

07<xsd:maxInclusivevalue="200"/>

08</xsd:restriction>

09</xsd:simpleType>

10</xsd:schema>程序名称:ch4-12.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<BookPricexmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-12.xsd">

0325.60

04</BookPrice>案例分析:由于图书价格不可能是0,因此程序ch4-12.xsd中的第06行代码使用<xsd:minExclusivevalue="0"/>指定临界最小值“0”,表示元素的值必须大于最小值“0”。上面案例中图书价格元素的取值范围为“0<图书价格元素值≤200”。同样可以使用<xsd:maxExclusivevalue="***"/>指定临界最大值,表示元素的值必须小于最大值。4.3.3限制小数位数

限制小数位数使用<xsd:fractionDigitsvalue=“***”/>来定义数字的小数部分位数。例4-13的案例给出了一个定义图书价格元素类型的Schema文档。

【例4-13】

案例说明:使用Schema定义一个具有取值范围限制和小数位数限制的简单类型,由小数类型派生。程序名称:ch4-13.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="BookPrice"type="PriceType"/>

04<xsd:simpleTypename="PriceType">

05<xsd:restrictionbase="xsd:decimal">

06<xsd:fractionDigitsvalue="2"/>07<xsd:minExclusivevalue="0"/>

08<xsd:maxInclusivevalue="200"/>

09</xsd:restriction>

10</xsd:simpleType>

11</xsd:schema>程序名称:ch4-13.xml

01<?xmlversion=“1.0”encoding=“utf-8”?>

02<BookPricexmlns:xsi=“/2001

/XMLSchema-instance”

xsi:noNamespaceSchemaLocation=“ch4-13.xsd”>

0325.60

04</BookPrice>

案例分析:第06行代码指定了小数位数为“2”,如果要对数字的总位数进行约束则使用<xsd:totalDigitsvalue="***"/>进行限定,同样value属性的值指定了数字总位数。4.3.4枚举类型

如果遇到表达星期几的元素时只能从七个取值(星期一、星期二、星期三、星期四、星期五、星期六和星期天)中取出一个值;如果表达奥运会比赛奖牌的元素只能从三个取值(金牌、银牌、铜牌)中取出一个值;如果表达小写字母元素只能从26个取值(a、b、c、…、z)中取出一个值。

上面所描述的元素类型就可以定义为枚举类型,枚举类型是一种取值集合。定义枚举类型使用<xsd:enumerationvalue="***"/>,value属性的取值则定义了取值集合中的一个值。例4-14的案例给出了一个定义性别元素类型的Schema文档。

【例4-14】

案例说明:使用Schema定义一个枚举简单类型,由字符串类型派生。

程序名称:ch4-14.xsd

01<?xmlversion=“1.0”encoding=“utf-8”?>

02<xsd:schemaxmlns:xsd=“/2001

/XMLSchema”>

03<xsd:elementname=“Gender”type

=“GenderEnumType”/>

04<xsd:simpleTypename=“GenderEnumType”>

05<xsd:restrictionbase="xsd:string">06<xsd:enumerationvalue="男"/>

07<xsd:enumerationvalue="女"/>

08</xsd:restriction>

09</xsd:simpleType>

10</xsd:schema>程序名称:ch4-14.xml

01<?xmlversion=“1.0”encoding=“utf-8”?>

02<Genderxmlns:xsi=“/2001

/XMLSchema-instance”

xsi:noNamespaceSchemaLocation=“ch4-14.xsd”>

03男

04</Gender>

案例分析:在程序ch4-13.xsd中第03行代码定义的“Gender”元素在XML实例文档中只能取“男”(第06行定义)或“女”(第07行定义)中的一个值。4.3.5模式匹配

本章前面小节讲述了如何给数据类型施加长度约束、取值范围约束和取值集合约束。如果要对电话号码这样的数据类型施加约束,应该如何进行?电话号码的典型取值例子有、、等,约束的表达应该是“三位或者四位数字”加上“-”再加上“七位或者八位数字”。对于这种数据类型的格式约束使用<xsd:patternvalue=“\正则表达式”/>来进行指定,其中value属性的值为一个正则表达式。电话号码的约束表达为“三位或者四位数字”加上“-”再加上“七位或者八位数字”,正则表达式为“\d{3,4}-\d{7,8}”。

再比如,对于一个正规出版的书籍,一般都有一个ISBN(InternationalStandardBookNumber,国际标准书号)。例如ISBN7-5606-0534-6/TP0264表达的就是一个中国境内出版的图书标准编号,其中:7代表该书是中国出版的;

5606是由国家ISBN中心分配给该书的;

0535是出版社自己给出的;

6是电子计算机的校验码;

TP指该书是“自动化技术、计算机技术”方面的;

0624是书的特征数据。

例4-15的案例给出了一个定义图书ISBN类型的Schema文档。

【例4-15】

案例说明:使用Schema定义一个具有强制格式及位数的简单类型,由字符串类型派生。

程序名称:ch4-15.xsd

01<?xmlversion=“1.0”encoding=“utf-8”?>

02<xsd:schemaxmlns:xsd=“/2001/XMLSchema”>

03<xsd:elementname=“ISBN”type=“ISBNType”/>

04<xsd:simpleTypename=“ISBNType”>

05<xsd:restrictionbase="xsd:string">06<xsd:patternvalue="\d{1}-\d{4}-\d{4}-\d{1}/TP\d{4}"/>

07<xsd:lengthvalue="20"/>

08</xsd:restriction>

09</xsd:simpleType>

10</xsd:schema>程序名称:ch4-15.xml

01<?xmlversion=“1.0”encoding=“utf-8”?>

02<ISBNxmlns:xsi=“/2001

/XMLSchema-instance”

xsi:noNamespaceSchemaLocation=“ch4-15.xsd”>

037-5606-0492-7/TP0229

04</ISBN>

案例分析:注意程序ch4-15.xsd中第06行代码表达的value属性值中的正则表达式“\d{1}-\d{4}-\d{4}-\d{1}/TP\d{4}”,其中的“/TP”和“-”都代表占位符。4.3.6元素的固定值和默认值

本章上述各节讲述的元素的一般定义形式为<xsd:elementname=“elementName”type=“elementType”/>,其中name和type属性是必需的属性,另外还有两个可选属性——default(默认值)和fixed(固定值)。

元素的默认值是在Schema文档元素的声明中预先设定的元素值。当XML文档元素的内容为空时,处理器会将Schema文档元素的预设值当作该元素的值。元素的固定值也是在Schema文档元素的声明中预先设定的元素值。固定值限定XML文档元素出现时,其值必须和Schema文档元素的预设固定值相等。可以理解为只有一个枚举值的枚举类型,例如水在正常气压下的沸点温度只能是100℃,其Schema元素声明为:

<xsd:elementname=“Boil_temperature”type=“xsd:integer”fixed=“100”/>

例4-16的案例给出了一个带有默认值属性的图书数量元素的Schema文档。【例4-16】

案例说明:使用Schema定义具有默认值的元素。

程序名称:ch4-16.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="BookNumber"type="xsd:integer"default="0"/>

04</xsd:schema>程序名称:ch4-16.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<BookNumberxmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-16.xsd">

03</BookNumber>案例分析:处理器在处理程序ch4-16.xml的文档时,元素<BookNumber>没有数据内容,处理器会将该元素的内容视为Schema元素声明中属性default的值——整数“0”。本案例中,处理器只是将XML文档中元素的值视为默认值,并未改变XML文档的内容,这点要特别注意。将程序ch4-16.xsd中的第03行代码指定默认值的代码“default="0"”删除后,程序ch4-16.xml将无法通过有效性验证。因为未设定默认值,处理器在遇到元素数据内容为空时,将使用空字符串进行有效性校验。而第03行代码定义该元素的数据类型为“integer”,所以无法通过校验。

4.4XMLSchema声明复杂类型

复杂元素的类型声明由于子元素和属性的存在,相应的约束也比简单元素的类型声明要复杂。本节将介绍声明复杂类型所采用的主要技术。4.4.1定义元素顺序

一个元素通常会包含很多子元素,例如关于图书信息的描述可能包含作者姓名、作者年龄、作者性别这三个子元素。多个子元素的存在首先要解决的就是顺序问题,Schema提供了all(任意顺序)、sequence(特定顺序)和choice(选择顺序)三种指示符来解决这个问题。

例4-17给出了一个使用all指示符的声明图书信息的复杂类型声明,其中声明了父元素图书信息“BookInfo”,以及子元素图书作者性别“AuthorGender”、图书作者年龄“AuthorAge”和图书作者姓名“AuthorName”。【例4-17】

案例说明:使用顺序指示符all定义的复杂类型。

程序名称:ch4-17.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="BookInfo">

04<xsd:complexType>

05<xsd:all>06<xsd:elementname="AuthorGender"type="xsd:string"/>

07<xsd:elementname="AuthorAge"type

="xsd:positiveInteger"/>

08<xsd:elementname="AuthorName"type

="xsd:string"/>

09</xsd:all>

10</xsd:complexType>

11</xsd:element>

12</xsd:schema>程序名称:ch4-17.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<BookInfoxmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-17.xsd">

03<AuthorName>楼桦</AuthorName>

04<AuthorAge>32</AuthorAge>

05<AuthorGender>男</AuthorGender>

06</BookInfo>案例分析:程序ch4-17.xsd的第04行代码<xsd:complexType>和第10行代码</xsd:complexType>用来声明复杂类型,而4.2节中声明简单类型使用的是<xsd:sampleType>。

程序ch4-17.xsd的第05行代码<xsd:all>和第09行代码</xsd:all>使用“all”指示符进行了子元素的顺序定义,该指示符中定义的子元素在XML文档中必须出现,但顺序可以任意。程序ch4-17.xsd的第06行、第07行和第08行代码分别定义了<BookInfo>的三个子元素<AuthorGender>、<AuthorAge>和<AuthorName>。程序ch4-17.xml中元素的顺序为<AuthorName>、<AuthorAge>、<AuthorGender>。该XML文档可以通过有效性验证,因为Schema中的子元素顺序指示符为all,即任意顺序。

例4-18给出了一个使用sequence指示符的声明图书信息的复杂类型声明。【例4-18】

案例说明:使用顺序指示符sequence定义的复杂类型。

程序名称:ch4-18.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="BookInfo">

04<xsd:complexType>

05<xsd:sequence>06<xsd:elementname="AuthorGender"

type="xsd:string"/>

07<xsd:elementname="AuthorAge"

type="xsd:positiveInteger"/>

08<xsd:elementname="AuthorName"

type="xsd:string"/>

09</xsd:sequence>

10</xsd:complexType>

11</xsd:element>

12</xsd:schema>程序名称:ch4-18.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<BookInfoxmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-18.xsd">

03<AuthorGender>男</AuthorGender>

04<AuthorAge>32</AuthorAge>

05<AuthorName>楼桦</AuthorName>

06</BookInfo>案例分析:程序ch4-18.xml中<BookInfo>的三个子元素必须出现,且顺序必须和程序ch4-18.xsd中定义的子元素顺序一致,因为Schema中的子元素顺序指示符为sequence,即特定顺序。Schema文档定义的子元素没有出现在XML文档中或者XML文档中子元素的顺序和Schema文档定义的不同,XML文档都不能通过有效性校验。

例4-19给出了一个使用choice指示符的声明图书信息的复杂类型声明。【例4-19】

案例说明:使用顺序指示符choice定义的复杂类型。

程序名称:ch4-19.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="BookInfo">

04<xsd:complexType>

05<xsd:choice>06<xsd:elementname="AuthorGender"

type="xsd:string"/>

07<xsd:elementname="AuthorAge"

type="xsd:positiveInteger"/>

08<xsd:elementname="AuthorName"

type="xsd:string"/>

09</xsd:choice>

10</xsd:complexType>

11</xsd:element>

12</xsd:schema>程序名称:ch4-19.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<BookInfoxmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-19.xsd">

03<AuthorAge>32</AuthorAge>

04</BookInfo>案例分析:程序ch4-19.xsd中定义的元素<BookInfo>的三个子元素在XML文档中必须出现且只能出现一个子元素,因为Schema中的子元素顺序指示符为choice,即选择顺序。XML文档中子元素的数量多于一个,XML文档将不能通过有效性校验。可以把choice指示符理解为针对Schema定义子元素的一个枚举。4.4.2定义元素出现次数

解决了复杂类型声明中的子元素顺序问题,紧接着就要解决子元素在父元素中以一定的顺序出现以后,在父元素中要出现多少的问题。Schema提供了子元素属性minOccurs的值来指定子元素在父元素中的最少出现数量,属性maxOccurs的值来指定子元素在父元素中的最多出现数量。当没有显式设定时,这两个属性的默认值都为1;当属性maxOccurs的值为“unbounded”时,表示不限制子元素在父元素中的出现次数。例4-20给出了一个使用定义子元素出现次数来声明复杂类型的案例。使用该案例的Schema定义的XML文档中,子元素图书作者姓名“AuthorName”在父元素图书信息“BookInfo”中只能出现一次,而子元素联系方式“LinkWay”在父元素图书信息“BookInfo”中的出现次数将不被限制。

【例4-20】

案例说明:使用minOccurs和maxOccurs属性定义的复杂类型。程序名称:ch4-20.xsd

01<?xmlversion="1.0"encoding="utf-8"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="BookInfo">

04<xsd:complexType>

05<xsd:sequence>06<xsd:elementname="AuthorName"type="xsd:string"minOccurs="1"/>

07<xsd:elementname="LinkWay"type="xsd:string"maxOccurs="unbounded"/>

08</xsd:sequence>

09</xsd:complexType>

10</xsd:element>

11</xsd:schema>程序名称:ch4-20.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<BookInfoxmlns:xsi="/2001

/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-20.xsd">

03<AuthorName>楼桦</AuthorName>

04<LinkWay>lt;/LinkWay>

05<LinkWay>lt;/LinkWay>

06<LinkWay>LOUHUAZZU@163.com</LinkWay>

07</BookInfo>需要注意顺序指示符中的任意顺序all,使用该指示符其内部声明的元素maxOccurs属性值不能设置为大于1的数值,因为all所限定的子元素在其父元素中最多只能出现一次。4.4.3属性声明

解决了复杂类型声明中的子元素在父元素中出现的顺序问题,以及子元素在父元素中出现多少的问题,本节将解决如何定义属性的问题。Schema采用<xsd:attributename=“attributeName”type=“attributeType”/>来进行属性声明。在有顺序指示符的复杂类型声明中,属性声明必须在顺序指示符的结束标记后进行声明。

例4-21中Schema文档定义了元素图书信息“BookInfo”,该元素还定义了一个属性—国际标准书号“ISBN”。【例4-21】

案例说明:定义元素属性的Schema案例。

程序名称:ch4-21.xsd

01<?xmlversion="1.0"?>

02<xsd:schemaxmlns:xsd="/2001/XMLSchema">

03<xsd:elementname="BookInfo">

04<xsd:complexType>

05<xsd:sequence>

06<xsd:elementname="BookName"type="xsd:string"/>07<xsd:elementname="AuthorName"type="xsd:string"/>

08</xsd:sequence>

09<xsd:attributename="ISBN"type="xsd:string"use="required"/>

10</xsd:complexType>

11</xsd:element>

12</xsd:schema>程序名称:ch4-21.xml

01<?xmlversion="1.0"encoding="utf-8"?>

02<BookInfoISBN="7-5606-0492-7/TP0229"

xmlns:xsi="/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ch4-21.xsd">

03<BookName>XML编程指南</BookName>

04<AuthorName>楼桦</AuthorName>

05</BookInfo>案例分析:注意到程序ch4-21.xsd第09行代码中不仅定义了属性名称“name”和属性类型“type”,还使用“use”选项定义了“ISBN”属性是否必须出现在XML文档中。在本案例中,“ISBN”属性被设置为必须出现“required”。“use”选项的取值可以是“required”、“optional”或“prohibited”,这三个取值的含义如下:

①值required代表定义的属性必须出现在XML文档中;

②值optional代表定义的属性可以出现也可以不出现在XML文档中;

③值prohibited代表定义的属性不能出现在XML文档中。如果一个属性声明没有定义use选项,那么该选项的默认值为“optional”。属性声明中同样有“default”和“fixed”两个选项。“default”选项用来给属性赋以默认值,该默认值只有当属性未出现在XML文档中时,处理器才把属性的值视为“default”选项设定的值。“fixed”选项用于限制属性为固定值。4.4.4ref引用

下面的案例提供了一个表达图书信息“BookInfo”的Schema定义(程序ch4-22.xsd),这个Schema文档定义的元素嵌套信息如图4-1所示。图4-1案例4-22表达的元素嵌套层次树

【例4-22】

案例说明:未使用ref引用元素声明的Schema定义类型的案例。

程序名称:ch4-22.xsd

01<?xmlversion=“1.0”?>

02<xsd:schemaxmlns:xsd=“/2001/XMLSchema”>

03<xsd:elementname=“BookInfo”>

04<xsd:complexType>

05<xsd:sequence>

06<xsd:elementname="BookName"type="xsd:string"/>07<xsd:elementname="PublisherAddress">

08<xsd:complexType>

09<xsd:sequence>

10<xsd:elementname="Province"

type="xsd:string"/>

11<xsd:elementname="City"type="xsd:string"/>

12<xsd:elementname="AddressDetail"typ

温馨提示

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

评论

0/150

提交评论