Java Web基础入门第七讲 XML语言——XML Schema
发布日期:2021-06-30 18:04:10 浏览次数:2 分类:技术文章

本文共 9372 字,大约阅读时间需要 31 分钟。

XML Schema简介

XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,其出现是为了克服DTD的局限性。

在这里插入图片描述

Schema约束快速入门

XML Schema文件自身就是一个XML文件,但它的扩展名通常为.xsd。一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的XML文件称之为实例文档。和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根结点的名称为Schema。

编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,XML文档中编写的元素来自哪里,被谁约束。

Schema入门案例

编写一个XML Schema约束文档,例如book.xsd:

然后遵循此约束文档编写一个XML实例文档,例如book.xml:

JavaScript网页开发
张孝祥
28.00元

名称空间

名称空间的概念

在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。在XML文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:

...

此处使用itcast来指向声明的名称,以便于后面对名称空间的引用。注意:名称空间的名字语法容易让人混淆,尽管以http://开始,但那个URI并不指向一个包含模式定义的文件。事实上,这个URI:http://www.itcast.cn根本没有指向任何文件,只是一个分配的名字。

使用名称空间引入Schema文件

为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定,例如:

schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的XML schema的位置,两者之间用空格分隔。

注意:在使用schemaLocation属性时,也需要指定该属性来自哪里。以上例子通过名称空间声明(xmlns)来指定schemaLocation属性来自http://www.w3.org/2001/XMLSchema-instance

使用默认名称空间

默认名称空间的基本格式为xmlns="URI"。下面我会举一个例子来说明。

<书架 xmlns="http://www.itcast.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.itcast.cn book.xsd">
<书>
<书名>
JavaScript网页开发
<作者>
张孝祥
<售价>
28.00元
<书架>

使用名称空间引入多个XML Schema文档

这里有一个文件清单(xmlbook.xml),看懂了,你就知道如何使用名称空间引入多个XML Schema文档了。

<书架 xmlns="http://www.it315.org/xmlbook/schema" xmlns:demo="http://www.it315.org/demo/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xmlbook.xsd http://www.it315.org/demo/schema http://www.it315.org/demo.xsd">
<书>
<书名>
JavaScript网页开发
<作者>
张孝祥
<售价 demo:币种="人民币">
28.00元

不使用名称空间引入XML Schema文档

这里同样有一个文件清单(xmlbook.xml),看懂了,你就知道如何不使用名称空间引入XML Schema文档了。

<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nonamespaceschemalocation="xmlbook.xsd">
<书>
<书名>
JavaScript网页开发
<作者>
张孝祥
<售价>
28.00元

这个例子中的元素就不属于任何名称空间,但是我们想说明这些词汇来自xmlbook.xsd模式文档,就可以通过noNamespaceSchemaLocation属性来指定。

在XML Schema文档中声明名称空间

例子如下:

  • targetNamespace元素用于指定Schema文档中声明的元素属于哪个名称空间;
  • elementFormDefault属性的值设为"qualified"用于指定该Schema文档中声明的根元素及其所有子元素都属于targetNamespace所指定的名称空间;elementFormDefault属性的值设为"unqualified"只用于指定该Schema文档中声明的根元素属于targetNamespace所指定的名称空间。

Schema语法

以下Schema语法参考自w3c帮助文档。

XSD 简易元素

XML Schema可定义XML文件的元素。

什么是简易元素?

简易元素指那些只包含文本的元素,它不会包含任何其他的元素或属性。不过,“仅包含文本”这个限定却很容易造成误解。文本有很多类型,它可以是XML Schema定义中包括的类型中的一种(布尔、字符串、数据等等),或者它也可以是您自行定义的定制类型。您也可向数据类型添加限定(即facets),以此来限制它的内容,或者您可以要求数据匹配某种特定的模式。

定义简易元素

定义简易元素的语法:

此处xxx指元素的名称,yyy指元素的数据类型。XML Schema拥有很多内建的数据类型。最常用的类型是:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

下面举例说明,例如这是一些XML元素:

Smith
28
1980-03-27

这是相应的简易元素的定义:

简易元素的默认值和固定值

简易元素可拥有指定的默认值或固定值。当没有其他的值被规定时,默认值就会自动分配给元素。

  • 在下面的例子中,缺省值是 “red”:

  • 在下面的例子中,固定值是 “red”:

    固定值同样会自动分配给元素,并且您无法规定另外一个值。

XSD 属性

所有的属性均作为简易类型来声明。

什么是属性?

简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

如何声明属性?

定义属性的语法是:

在此处,xxx指属性名称,yyy则规定属性的数据类型。XML Schema拥有很多内建的数据类型。最常用的类型是:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

下面举例说明,例如这是带有属性的XML元素:

Smith

这是对应的属性定义:

属性的默认值和固定值

属性可拥有指定的默认值或固定值。当没有其他的值被规定时,默认值就会自动分配给元素。

  • 在下面的例子中,缺省值是 “EN”:

  • 在下面的例子中,固定值是 “EN”:

    固定值同样会自动分配给元素,并且您无法规定另外的值。

可选的和必需的属性

在缺省的情况下,属性是可选的。如需规定属性为必选,请使用"use"属性:

对内容的限定

当XML元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。假如XML元素的类型是"xs:date",而其包含的内容是类似"Hello World"的字符串,元素将不会(通过)验证。通过XML Schema,您也可向您的XML元素及属性添加自己的限定。这些限定被称为facet(编者注:意为(多面体的)面,可译为限定面)。您会在下一节了解到更多有关facet的知识。

XSD 限定/Facets

限定(restriction)用于为XML元素或者属性定义可接受的值。对XML元素的限定被称为facet。

对值的限定

下面的例子定义了带有一个限定且名为"age"的元素,age的值不能低于0或者高于120:

对一组值的限定

如需把XML元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration constraint)。

下面的例子定义了带有一个限定的名为"car"的元素,可接受的值只有Audi,Golf,BMW:

上面的例子也可以被写为:

注意:在这种情况下,类型"carType"可被其他元素使用,因为它不是"car"元素的组成部分。

对一系列值的限定

如需把XML元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)。

下面的例子定义了带有一个限定的名为"letter"的元素,可接受的值只有小写字母a-z其中的一个:

下一个例子定义了带有一个限定的名为"initials"的元素,可接受的值是大写字母A-Z其中的三个:

下一个例子也定义了带有一个限定的名为"initials"的元素,可接受的值是大写或小写字母a-z其中的三个:

下一个例子定义了带有一个限定的名为"choice"的元素,可接受的值是字母x,y或z中的一个:

下一个例子定义了带有一个限定的名为"prodid"的元素,可接受的值是五个阿拉伯数字的一个序列,且每个数字的范围是0-9:

对一系列值的其他限定

下面的例子定义了带有一个限定的名为"letter"的元素,可接受的值是a-z中零个或多个字母:

下面的例子定义了带有一个限定的名为"letter"的元素,可接受的值是一对或多对字母,每对字母由一个小写字母后跟一个大写字母组成。举个例子,“sToP"将会通过这种模式的验证,但是是"Stop”、"STOP"或者"stop"无法通过验证:

下面的例子定义了带有一个限定的名为"gender"的元素,可接受的值是male或者female:

下面的例子定义了带有一个限定的名为"password"的元素,可接受的值是由8个字符组成的一行字符,这些字符必须是大写或小写字母a-z亦或数字0-9:

对长度的限定

如需限制元素中值的长度,我们需要使用length、maxLength以及minLength限定。

下面的例子定义了带有一个限定且名为"password"的元素,其值必须精确到8个字符:

这个例子也定义了带有一个限定的名为"password"的元素,其值最小为5个字符,最大为8个字符:

数据类型的限定

限定 描述
enumeration 定义可接受值的一个列表。
fractionDigits 定义所允许的最大的小数位数。必须大于等于0。
length 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive 定义数值的上限。所允许的值必须小于此值。
maxInclusive 定义数值的上限。所允许的值必须小于或等于此值。
maxLength 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive 定义数值的下限。所允许的值必需大于此值。
minInclusive 定义数值的下限。所允许的值必需大于或等于此值。
minLength 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern 定义可接受的字符的精确序列。
totalDigits 定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace 定义空白字符(换行、回车、空格以及制表符)的处理方式。

XSD 复合元素

复合元素包含了其他的元素及/或属性。

什么是复合元素?

复合元素指包含其他元素及/或属性的XML元素。有四种类型的复合元素:

  1. 空元素
  2. 包含其他元素的元素
  3. 仅包含文本的元素
  4. 包含元素和文本的元素
    注释:上述元素均可包含属性!

下面举例说明复合元素。

  • 复合元素,“product”,是空的:

  • 复合元素,“employee”,仅包含其他元素:

    John
    Smith
  • 复合元素,“food”,仅包含文本:

    Ice cream
  • 复合元素,“description”,包含元素和文本:

    It happened on
    03.03.99
    ....

如何定义复合元素?

请看这个复合XML元素,“employee”,仅包含其他元素:

John
Smith

在XML Schema中,我们有两种方式来定义复合元素:

  1. 通过命名此元素,可直接对"employee"元素进行声明,就像这样:

    假如您使用上面所描述的方法,那么仅有"employee"可使用所规定的复合类型。请注意其子元素,“firstname"以及"lastname”,被包围在指示器<sequence>中。这意味着子元素必须以它们被声明的次序出现。您会在XSD指示器这一节学习更多有关指示器的知识。

  2. "employee"元素可以使用type属性,这个属性的作用是引用要使用的复合类型的名称:

    如果您使用了上面所描述的方法,那么若干元素均可以使用相同的复合类型,比如这样:

    您也可以在已有的复合元素之上以某个复合元素为基础,然后添加一些元素,就像这样:

XSD 复合空元素

空的复合元素不能包含内容,只能含有属性。例如,一个空的XML元素如下:

上面的"product"元素根本没有内容。为了定义无内容的类型,我们就必须声明一个在其内容中只能包含元素的类型,但是实际上我们并不会声明任何元素,比如这样:

在上面的例子中,我们定义了一个带有复合内容的复合类型。complexContent元素给出的信号是,我们打算限定或者拓展某个复合类型的内容模型,而integer限定则声明了一个属性但不会引入任何的元素内容。

不过,也可以更加紧凑地声明此"product"元素:

或者您可以为一个complexType元素起一个名字,然后为"product"元素设置一个type属性并引用这个complexType名称(通过使用此方法,若干个元素均可引用相同的复合类型):

XSD 复合类型指示器

通过指示器,我们可以控制在文档中使用元素的方式。

指示器

XML Schema中有七种指示器,如下:

在这里插入图片描述

Order 指示器

Order 指示器用于定义元素的顺序。

  • All 指示器

    <all>指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次:

    注释:当使用<all>指示器时,你可以把<minOccurs>设置为0或者1,而只能把<maxOccurs>指示器设置为1(稍后将讲解<minOccurs>以及<maxOccurs>)。

  • Choice 指示器

    <choice>指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼):

    提示:如需设置子元素出现任意次数,可将<maxOccurs>(稍后会讲解)设置为unbounded(无限次)。

  • Sequence 指示器

    <sequence>规定子元素必须按照特定的顺序出现:

Occurrence 指示器

Occurrence 指示器用于定义某个元素出现的频率。对于所有的"Order"和"Group"指示器(any、all、choice、sequence、group name以及group reference),其中的maxOccurs以及minOccurs的默认值均为1。

  • maxOccurs 指示器

    <maxOccurs>指示器可规定某个元素可出现的最大次数:

    上面的例子表明,子元素"child_name"可在 “person” 元素中最少出现一次(其中minOccurs的默认值是1),最多出现10次。

  • minOccurs 指示器

    <minOccurs>指示器可规定某个元素能够出现的最小次数:

    上面的例子表明,子元素"child_name"可在"person"元素中出现最少0次,最多出现10次。

    提示:如需使某个元素的出现次数不受限制,请使用maxOccurs="unbounded"这个声明。

案例

下面是一个名为"Myfamily.xml"的XML文件:

Tony Smith
Cecilie
David Smith
Jogn
mike
kyle
mary
Michael Smith

上面这个XML文件含有一个名为"persons"的根元素。在这个根元素内部,我们定义了三个"person"元素。每个"person"元素必须含有一个"full_name"元素,同时它可以包含多至4个"child_name"元素。下面是Schema文件"family.xsd":

一个综合案例

这是名为"shiporder.xsd"的Schema文件的文档清单:

依据以上Scheme文档编写的shiporder.xml文件:

xxx
haha
天门
天门市
中国
标题
笔记
12
0.1

转载地址:https://liayun.blog.csdn.net/article/details/87898902 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:两道面试题:如何调整JVM内存大小与打印M型的平面图形
下一篇:Java Web基础入门第六讲 XML语言——DOM4J保存数据的乱码问题

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月05日 00时09分41秒