[关闭]
@liayun 2016-06-30T11:01:28.000000Z 字数 16358 阅读 1938

XML Schema

JavaWeb


XML Schema简介

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

Schema约束快速入门

Schema入门案例

编写一个XML Schema约束文档——book.xsd如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  3. targetNamespace="http://www. itcast.cn"
  4. elementFormDefault="qualified">
  5. <xs:element name='书架' >
  6. <xs:complexType>
  7. <xs:sequence maxOccurs='unbounded' >
  8. <xs:element name='书' >
  9. <xs:complexType>
  10. <xs:sequence>
  11. <xs:element name='书名' type='xs:string' />
  12. <xs:element name='作者' type='xs:string' />
  13. <xs:element name='售价' type='xs:string' />
  14. </xs:sequence>
  15. </xs:complexType>
  16. </xs:element>
  17. </xs:sequence>
  18. </xs:complexType>
  19. </xs:element>
  20. </xs:schema>

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <itcast:书架 xmlns:itcast="http://www.itcast.cn"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation=“http://www.itcast.cn book.xsd">
  5. <itcast:书>
  6. <itcast:书名>JavaScript网页开发</itcast:书名>
  7. <itcast:作者>张孝祥</itcast:作者>
  8. <itcast:售价>28.00元</itcast:售价>
  9. </itcast:书>
  10. </itcast:书架>

名称空间

名称空间的概念

使用名称空间引入Schema文件

使用默认名称空间

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

例,文件清单:xmlbook.xml。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <书架 xmlns="http://www.it315.org/xmlbook/schema"
  3. xmlns:demo="http://www.it315.org/demo/schema"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xmlbook.xsd
  6. http://www.it315.org/demo/schema http://www.it315.org/demo.xsd">
  7. <书>
  8. <书名>JavaScript网页开发</书名>
  9. <作者>张孝祥</作者>
  10. <售价 demo:币种="人民币">28.00元</售价>
  11. </书>
  12. </书架>

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

例,文件清单:xmlbook.xml。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="xmlbook.xsd">
  4. <书>
  5. <书名>JavaScript网页开发</书名>
  6. <作者>张孝祥</作者>
  7. <售价>28.00元</售价>
  8. </书>
  9. </书架>

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

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

  1. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  2. targetNamespace="http://www. itcast.cn"
  3. elementFormDefault="qualified">
  4. <xs:schema>

Schema语法

以下Schema语法参考w3c文档。

XSD 简易元素

XML Schema可定义XML文件的元素。
简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。

什么是简易元素?

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

定义简易元素

定义简易元素的语法:

  1. <xs:element name="xxx" type="yyy"/>

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

例子:
这是一些XML元素:

  1. <lastname>Smith</lastname>
  2. <age>28</age>
  3. <dateborn>1980-03-27</dateborn>

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

  1. <xs:element name="lastname" type="xs:string"/>
  2. <xs:element name="age" type="xs:integer"/>
  3. <xs:element name="dateborn" type="xs:date"/>

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

简易元素可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。
在下面的例子中,缺省值是 "red":

  1. <xs:element name="color" type="xs:string" default="red"/>

固定值同样会自动分配给元素,并且您无法规定另外一个值。
在下面的例子中,固定值是 "red":

  1. <xs:element name="color" type="xs:string" fixed="red"/>

XSD 属性

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

什么是属性?

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

如何声明属性?

定义属性的语法是:

  1. <xs:attribute name="xxx" type="yyy"/>

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

实例:
这是带有属性的XML元素:

  1. <lastname lang="EN">Smith</lastname>

这是对应的属性定义:

  1. <xs:attribute name="lang" type="xs:string"/>

属性的默认值和固定值

属性可拥有指定的默认值或固定值。
当没有其他的值被规定时,默认值就会自动分配给元素。
在下面的例子中,缺省值是 "EN":

  1. <xs:attribute name="lang" type="xs:string" default="EN"/>

固定值同样会自动分配给元素,并且您无法规定另外的值。
在下面的例子中,固定值是 "EN":

  1. <xs:attribute name="lang" type="xs:string" fixed="EN"/>

可选的和必需的属性

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

  1. <xs:attribute name="lang" type="xs:string" use="required"/>

对内容的限定

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

XSD 限定/Facets

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

对值的限定

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

  1. <xs:element name="age">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:integer">
  4. <xs:minInclusive value="0"/>
  5. <xs:maxInclusive value="120"/>
  6. </xs:restriction>
  7. </xs:simpleType>
  8. </xs:element>

对一组值的限定

如需把XML元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration constraint)。
下面的例子定义了带有一个限定的名为"car"的元素。可接受的值只有:Audi,Golf,BMW:

  1. <xs:element name="car">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:enumeration value="Audi"/>
  5. <xs:enumeration value="Golf"/>
  6. <xs:enumeration value="BMW"/>
  7. </xs:restriction>
  8. </xs:simpleType>
  9. </xs:element>

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

  1. <xs:element name="car" type="carType"/>
  2. <xs:simpleType name="carType">
  3. <xs:restriction base="xs:string">
  4. <xs:enumeration value="Audi"/>
  5. <xs:enumeration value="Golf"/>
  6. <xs:enumeration value="BMW"/>
  7. </xs:restriction>
  8. </xs:simpleType>

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

对一系列值的限定

如需把XML元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)。
下面的例子定义了带有一个限定的名为"letter"的元素。可接受的值只有小写字母a-z其中的一个:

  1. <xs:element name="letter">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:pattern value="[a-z]"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

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

  1. <xs:element name="initials">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:pattern value="[A-Z][A-Z][A-Z]"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

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

  1. <xs:element name="initials">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

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

  1. <xs:element name="choice">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:pattern value="[xyz]"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

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

  1. <xs:element name="prodid">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:integer">
  4. <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

对一系列值的其他限定

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

  1. <xs:element name="letter">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:pattern value="([a-z])*"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

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

  1. <xs:element name="letter">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:pattern value="([a-z][A-Z])+"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

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

  1. <xs:element name="gender">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:pattern value="male|female"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

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

  1. <xs:element name="password">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:pattern value="[a-zA-Z0-9]{8}"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

对长度的限定

如需限制元素中值的长度,我们需要使用length、maxLength以及minLength限定。
本例定义了带有一个限定且名为"password"的元素。其值必须精确到8个字符:

  1. <xs:element name="password">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:length value="8"/>
  5. </xs:restriction>
  6. </xs:simpleType>
  7. </xs:element>

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

  1. <xs:element name="password">
  2. <xs:simpleType>
  3. <xs:restriction base="xs:string">
  4. <xs:minLength value="5"/>
  5. <xs:maxLength value="8"/>
  6. </xs:restriction>
  7. </xs:simpleType>
  8. </xs:element>

数据类型的限定

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

XSD 复合元素

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

什么是复合元素?

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

复合元素的例子:
复合元素,"product",是空的:

  1. <product pid="1345"/>

复合元素,"employee",仅包含其他元素:

  1. <employee>
  2. <firstname>John</firstname>
  3. <lastname>Smith</lastname>
  4. </employee>

复合元素,"food",仅包含文本:

  1. <food type="dessert">Ice cream</food>

复合元素,"description",包含元素和文本:

  1. <description>
  2. It happened on <date lang="norwegian">03.03.99</date> ....
  3. </description>

如何定义复合元素?

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

  1. <employee>
  2. <firstname>John</firstname>
  3. <lastname>Smith</lastname>
  4. </employee>

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

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

    1. <xs:element name="employee">
    2. <xs:complexType>
    3. <xs:sequence>
    4. <xs:element name="firstname" type="xs:string"/>
    5. <xs:element name="lastname" type="xs:string"/>
    6. </xs:sequence>
    7. </xs:complexType>
    8. </xs:element>

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

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

    1. <xs:element name="employee" type="personinfo"/>
    2. <xs:complexType name="personinfo">
    3. <xs:sequence>
    4. <xs:element name="firstname" type="xs:string"/>
    5. <xs:element name="lastname" type="xs:string"/>
    6. </xs:sequence>
    7. </xs:complexType>

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

    1. <xs:element name="employee" type="personinfo"/>
    2. <xs:element name="student" type="personinfo"/>
    3. <xs:element name="member" type="personinfo"/>
    4. <xs:complexType name="personinfo">
    5. <xs:sequence>
    6. <xs:element name="firstname" type="xs:string"/>
    7. <xs:element name="lastname" type="xs:string"/>
    8. </xs:sequence>
    9. </xs:complexType>

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

    1. <xs:element name="employee" type="fullpersoninfo"/>
    2. <xs:complexType name="personinfo">
    3. <xs:sequence>
    4. <xs:element name="firstname" type="xs:string"/>
    5. <xs:element name="lastname" type="xs:string"/>
    6. </xs:sequence>
    7. </xs:complexType>
    8. <xs:complexType name="fullpersoninfo">
    9. <xs:complexContent>
    10. <xs:extension base="personinfo">
    11. <xs:sequence>
    12. <xs:element name="address" type="xs:string"/>
    13. <xs:element name="city" type="xs:string"/>
    14. <xs:element name="country" type="xs:string"/>
    15. </xs:sequence>
    16. </xs:extension>
    17. </xs:complexContent>
    18. </xs:complexType>

XSD 复合空元素

空的复合元素不能包含内容,只能含有属性。

复合空元素

一个空的XML元素:

  1. <product prodid="1345" />

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

  1. <xs:element name="product">
  2. <xs:complexType>
  3. <xs:complexContent>
  4. <xs:restriction base="xs:integer">
  5. <xs:attribute name="prodid" type="xs:positiveInteger"/>
  6. </xs:restriction>
  7. </xs:complexContent>
  8. </xs:complexType>
  9. </xs:element>

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

  1. <xs:element name="product">
  2. <xs:complexType>
  3. <xs:attribute name="prodid" type="xs:positiveInteger"/>
  4. </xs:complexType>
  5. </xs:element>

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

  1. <xs:element name="product" type="prodtype"/>
  2. <xs:complexType name="prodtype">
  3. <xs:attribute name="prodid" type="xs:positiveInteger"/>
  4. </xs:complexType>

XSD 复合类型指示器

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

指示器

有七种指示器:

Order 指示器

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

Occurrence 指示器

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

一个实际的例子:
名为"Myfamily.xml"的XML文件:

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="family.xsd">
  4. <person>
  5. <full_name>Tony Smith</full_name>
  6. <child_name>Cecilie</child_name>
  7. </person>
  8. <person>
  9. <full_name>David Smith</full_name>
  10. <child_name>Jogn</child_name>
  11. <child_name>mike</child_name>
  12. <child_name>kyle</child_name>
  13. <child_name>mary</child_name>
  14. </person>
  15. <person>
  16. <full_name>Michael Smith</full_name>
  17. </person>
  18. </persons>

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

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  3. elementFormDefault="qualified">
  4. <xs:element name="persons">
  5. <xs:complexType>
  6. <xs:sequence>
  7. <xs:element name="person" maxOccurs="unbounded">
  8. <xs:complexType>
  9. <xs:sequence>
  10. <xs:element name="full_name" type="xs:string"/>
  11. <xs:element name="child_name" type="xs:string"
  12. minOccurs="0" maxOccurs="4"/>
  13. </xs:sequence>
  14. </xs:complexType>
  15. </xs:element>
  16. </xs:sequence>
  17. </xs:complexType>
  18. </xs:element>
  19. </xs:schema>

一个XSD实例

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  3. targetNamespace="http://www.itcast.cn" elementFormDefault="qualified">
  4. <xs:element name="shiporder">
  5. <xs:complexType>
  6. <xs:sequence>
  7. <xs:element name="orderperson" type="xs:string" />
  8. <xs:element name="shipto">
  9. <xs:complexType>
  10. <xs:sequence>
  11. <xs:element name="name" type="xs:string" />
  12. <xs:element name="address" type="xs:string" />
  13. <xs:element name="city" type="xs:string" />
  14. <xs:element name="country" type="xs:string" />
  15. </xs:sequence>
  16. </xs:complexType>
  17. </xs:element>
  18. <xs:element name="item" maxOccurs="unbounded">
  19. <xs:complexType>
  20. <xs:sequence>
  21. <xs:element name="title" type="xs:string" />
  22. <xs:element name="note" type="xs:string" minOccurs="0" />
  23. <xs:element name="quantity" type="xs:positiveInteger" />
  24. <xs:element name="price" type="xs:decimal" />
  25. </xs:sequence>
  26. </xs:complexType>
  27. </xs:element>
  28. </xs:sequence>
  29. <xs:attribute name="orderid" type="xs:string" use="required" />
  30. </xs:complexType>
  31. </xs:element>
  32. </xs:schema>

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <shiporder xmlns="http://www.itcast.cn"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.itcast.cn shiporder.xsd"
  5. orderid="111">
  6. <orderperson>xxx</orderperson>
  7. <shipto>
  8. <name>xxxx</name>
  9. <address>xxx</address>
  10. <city>xxx</city>
  11. <country>xxx</country>
  12. </shipto>
  13. <item>
  14. <title>xxx</title>
  15. <note>xxx</note>
  16. <quantity>12</quantity>
  17. <price>0.1</price>
  18. </item>
  19. </shiporder>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注