XML Schema

XML Schema

1、 Schema简介

1.1、Schema的诞生

XML在某些特殊的应用场合,对数据本身、数据的类型以及数据之间的联系都有一定的限制。这种限制不是由XML语法来规定的,而是在特殊的环境中所必须的一种限制。我们需要把这种限制用另外的方式表达出来,然后告诉用户和计算机。

Schema作为一种新的思想诞生了,Schema通常是一组为了描述某一类XML文档而定义好的一套规则。XML Schema与DTD一样,也是对某一类XML文档进行约束并确定其结构,包括对元素、属性、及数据类型的完整定义,及某个XML文档中所使用的元素、实体、元素的属性、元素与实体之间的关系的特殊约束。XML Schema最初是由微软提出并使用,后来在W3C的专家们充分讨论和论证的基础上,于1999年2月15日,W3C发布了一个需求定义,说明了新定义的Schema必须符合的要求。1999年5月6日,W3C完成并发布了Schema的定义。最终被确定成为一个标准。

教程:http://www.w3school.com.cn/schema/

1.2、Schema的优势

XML Schema文件使用XML语法,在其设计目的方面与DTD类似,但是在功能方面,XML Schema比DTD更完善,并且更容易扩展。相比DTD主要优势有以下几点:

(1)一个XML Schema文件同时也是一个XML文档,

(2)Schema定义了多种数据类型。在XMLSchema文件中可以像在其他编程语言那样来定义数据类型,如整型、字符型、浮点型、布尔型、日期型等。

(3)支持命名空间

1.3、Schema的建立

建立有效的Schema文件

         一个有效的Schema文件的结构如下:

<?xml version="1.0" encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

         elementFormDefault="qualified"attributeFormDefault="unqualified">

                   <!--这里编写内容-->

         </xs:schema>

注:attributeFormDefault 是Schema文件的声明部分。元素“xs:schema”是整个Schema文件的根元素,“xmlns”、“elementFormDefault”和“attributeFormDefault”都是Schema文件的属性,对整个Schema文件进行描述。

1.4、Schema类型元素

Schema类型的元素是Schema文件的根元素,每个Schema文件必须包含Schema类型的元素。Schema类型元素的属性有以下几种:

xmlns:xmlns是xmlnamespace的缩写,称为“命名空间” xmlns属性的值是一个URI或URL地址 xmlns属性不可缺少。

targetNamespace:该属性的值是在xmlns已经定义好的命名空间中选择。该属性可有可无

elementFormDefault:用于指示子元素是否放到命名空间中,有“qualified”和“unqualified”两种取值。

attributeFormDefault:用于指示是否把某个子元素的属性放到命名空间中,有“qualified”和“unqualified”两种取值

其它属性:“finalDefault”、“blockDefault”、“xml:lang”和“id”属性,对于这些属性一般都采用默认设置。

 

1.4.1、Schema简单类型元素

简单类型元素主要有:

simpleType类型元素

element类型元素

attribute类型元素

enumeration类型元素

pattern类型元素

union类型元素

list类型元素

(1)      simpleType类型元素

simpleType类型用于定义一个简单类型的元素。

simpleType类型的属性有“final”、“id”和“name”。“final”属性指出派生的类型,防止该simpleType元素的指定派生类型,该值可以包含一个列表,该列表是list、union或restriction元素的子集。如下:

<xs:simpleType>                                                                        

<xs:restrictionbase="xs:positiveInteger">

                 <!-- 限制取值范围-->                                                   

<xs:maxExclusivevalue="100"/>

      </xs:restriction>

</xs:simpleType>

 

注:xs:restriction :限制基类型元素

(2)      element类型元素

element用于定义一个普通的元素。一般格式如下:

<element name="name" type="string"></element>

<element name="age"type="int"></element>

         <element name="address"type="string"></element>

element元素的属性有name、abstract、block、default、final、fixed、id、nillable、maxOccurs、minOccurs、substitutionGroup和type

 

Name  属性的值是该element元素的元素名。

Type  属性的值是该element元素的数据类型。

Ref  属性的值必须指向一个全局元素。

maxOccurs   属性的值是元素在其父元素中出现的最大次数,它

         的取值为大于0或等于0的数,在默认状态下为unbounded

minOccurs   属性的值是元素在其父元素中出现的最小次数,它

         的取值为大于0或等于0的数,在默认状态下为1

(3)      attribute类型元素

attribute用于声明一个属性元素。如:

<?xmlversion="1.0" encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

         elementFormDefault="qualified"

         attributeFormDefault="unqualified">

                   <xs:attributename="a"></xs:attribute>

         </xs:schema>

attribute主要有name、default、fixed、id、 ref、type、use几种属性

I、Default: 指该attribute类型元素的名称具有默认值;

II、fixed: 指该attribute类型元素的名称具有固定的值 ;

III、use: 指示如何使用该attribute类型元素。use属性的值必须是“optional”、“prohibited”、“required”中的一种。

“optional”表示该属性可以是任何值,并且该属性是可选的;

“prohibited”表示不能使用该属性;“required”表示该属性必须出现一次。在默认状态下use的值是“optional”。

(4)      enumeration类型元素

enumeration类型用于显示某个元素或属性的枚举。enumeration类型元素的属性有“id”和“value”,id属性标识该值在枚举列表中的位置,value表示该enumeration类型元素的值。如下:

<?xml version="1.0" encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

         elementFormDefault="qualified"attributeFormDefault="unqualified">

            <xs:attributename="address">

                      <xs:simpleType>

                                     <xs:restrictionbase="xs:string">

                                               <xs:enumerationvalue="北京"/>

                                               <xs:enumerationvalue="上海"/>

                                     </xs:restriction>   

                      </xs:simpleType>

            </xs:attribute>

         </xs:schema>

(5)      pattern类型元素

pattern类型主要用于对某个属性或元素的值进行约束,pattern类型的属性有“id”和“value”。“value”属性的值是被约束元素或属性的值的形式。如下:

<?xml version="1.0" encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

         elementFormDefault="qualified"attributeFormDefault="unqualified">

                   <xs:elementname="id" type="mytype">

                   </xs:element>

                   <xs:simpleTypename="mytype">

                            <xs:restrictionbase="xs:string">

                                     <xs:patternvalue="\d{3}-[A-Z]{2}"/>

                            </xs:restriction>

                   </xs:simpleType>

         </xs:schema>

(6)      union和list类型元素

list类型定义单个simpleType类型元素,而union类型定义多个simpleType类型元素。

list类型有“id”和“itemType”属性。

“itemType”属性是指在该元素中定义的内置数据类型或 simpleType元素的名称。包含list元素的simpleType元素是从“itemType”值指定的简单类型派生的。list值必须是限定名。对simpleType元素子级和“itemType”属性的使用是互相排斥的。

union类型有“id”和“memberTypes”属性。

“memberTypes”属性是指在该元素中定义的内置数据类型或simpleType元素的名称列表。包含union元素的simpleType元素是从“memberTypes”值指定的简单类型派生的。

<?xml version="1.0"encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

         elementFormDefault="qualified"attributeFormDefault="unqualified">

                   <xs:attributename="id">

                            <xs:simpleType>

                                     <xs:unionmemberTypes="first second" />

                <!-- union类型定义多个simpleType类型元素-->

                            </xs:simpleType>

                   </xs:attribute>       

                   <!--  第一个simpleType  -->     

                   <xs:simpleTypename="first">

                            <xs:listitemType="second"></xs:list>

            <!-- list类型定义单个simpleType类型元素-->

                   </xs:simpleType>

                   <!--  第二个simpleType  -->

                   <xs:simpleTypename="second">

                            <xs:restrictionbase="xs:string">

                                     <xs:enumerationvalue="b001"/>

                                     <xs:enumerationvalue="b002"/>

                            </xs:restriction>

                   </xs:simpleType>

         </xs:schema>

1.5  Schema复杂类型元素

复杂类型是可以包含其他元素、属性和组的元素定义。 主要有以下几种:

         Sequence 类型元素

         complexType 类型元素

Choice 类型元素

simpleContent 类型元素

extension和restriction 类型元素

Group 类型元素

attributeGroup 类型元素

 

(1)      Sequence 类型元素

sequence类型要求组中的元素以指定的顺序出现在父元素中。与DTD中逗号的用法类似,sequence类型的属性如下:

 

id属性:唯一标识该sequence类型的元素。

maxOccurs和minOccurs属性:限制该元素组在父元素中出现的次数。

<?xml version="1.0" encoding="UTF-8"?>

   <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

   elementFormDefault="qualified"attributeFormDefault="unqualified">

            <xs:complexTypename="com">

                     <xs:sequenceid="a001" maxOccurs="unbounded" minOccurs="1">

<!--约束以name、age、address三个元素以指定的顺序出现在父元素中-->

                               <xs:elementname="name" type="xs:string"/>

                               <xs:elementname="age" type="xs:int"/>

                               <xs:elementname="address" type="xs:string"/>

                     </xs:sequence>

            </xs:complexType>

   </xs:schema>

(2)      complexType 类型元素

complexType类型用于定义一个复合类型的元素。

complexType类型的属性有以下几种:

    I、Name  属性该复合类型元素的名称。

II、Abstract  属性指示在实例文档中是否可以使用复杂类型。如果该值为true,则元素不能直接使用该复杂类型,而是必须使用从该复杂类型派生的复杂类型。默认值为false。

III、Block  属性防止具有指定派生类型的复杂类型被用来替代该复杂类型。

IV、Final  属性防止从该复杂类型元素派生出指定的类型。

V、Mixed  属性指示是否允许字符数据出现在该复杂类型的子元素之间。如果值为“false”,则不允许字符数据出现,反之,可以。

(3)      choice类型元素

choice类型限制唯一的一个元素从某个组中被选择。choice类型的属性主要有以下几种:

id属性:唯一标识该元素,id属性的值必须唯一。

maxOccurs和minOccurs属性:限制该元素组在父元素中出现的次数。

 

<?xml version="1.0"encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

          elementFormDefault="qualified"attributeFormDefault="unqualified">

                   <xs:elementname="zhangsan" type="xs:string"/>

                   <xs:elementname="lisi" type="xs:string"/>

                   <xs:complexTypename="chadState">

                            <xs:choice minOccurs="1"maxOccurs="1">

                                     <xs:elementref="zhangsan"/>

                                     <xs:elementref="lisi"/>

                            </xs:choice>

                   </xs:complexType>

         </xs:schema>

(4)       simpleContent类型元素

simpleContent类型用于对complexType元素或字符数据的约束并且不包含任何元素。simpleContent类型只有一个“id”属性,一般将其用于complexType元素的子元素,如下:

<?xml version="1.0"encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

         elementFormDefault="qualified"attributeFormDefault="unqualified">

                   <xs:elementname="name">

                            <xs:complexType>

                                     <xs:simpleContentid="a001"><!--对name元素进行类型约束-->

                                               <xs:extensionbase="xs:string">

                                                        <xs:attributename="id“

                                                                  type="xs:string" />

                                               </xs:extension>

                                     </xs:simpleContent>

                            </xs:complexType>

                   </xs:element>

         </xs:schema>

(5)      extension和restriction类型元素

extension和restriction类型元素都可用于在simpleContent类型元素中对complexType元素进行限制。

restriction类型是指将元素值的范围限制为继承的数据类型或simpleType元素的子集。

extension类型是指通过添加属性扩展simpleType的元素内容。

extension和restriction类型元素的属性有“id”和“base”。“base”属性指示在该类型元素中要限制的数据类型、simpleType元素或complexType元素的名称。

         <?xmlversion="1.0"encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

         elementFormDefault="qualified"attributeFormDefault="unqualified">

                   <xs:simpleTypename="simpleType1">

                            <xs:restrictionbase="xs:string">

                                     <xs:enumerationvalue="small"/>

                                     <xs:enumerationvalue="big"/>

                                     <xs:enumerationvalue="middle"/>

                            </xs:restriction>

                   </xs:simpleType>

                   <xs:complexTypename="class">

                            <xs:simpleContent>

                                     <xs:extensionbase="simpleType1">< !--对simpleType类型元素进行约束-->

                                               <xs:attribute name="student"type="xs:string"/>

                                     </xs:extension>

                            </xs:simpleContent>

                   </xs:complexType>

                   <xs:complexTypename="teacher">

                            <xs:simpleContent>

                                     <xs:restrictionbase="class">

<!--将元素的值限制为从复杂类型元素class继承-->

                                               <xs:enumerationvalue="small"/>

                                               <xs:enumerationvalue="big"/>

                                     </xs:restriction>

                            </xs:simpleContent>

                   </xs:complexType>

         </xs:schema>

(6)       group类型元素

group类型主要用于把一组元素组合在一起,以便在复合类型中应用。group类型的属性主要有name、maxOccurs、minOccurs、id和ref。如下:

   <?xml version="1.0" encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

         elementFormDefault="qualified"attributeFormDefault="unqualified">

                      <xs:element name="zhangsan"type="xs:string"/>

                      <xs:element name="lisi"type="xs:string"/>

                      <xs:group name="myGroup">

                               <xs:sequence>

                                        <xs:element ref="zhangsan"/>

                                        <xs:element ref="lisi"/>

                               </xs:sequence>

                      </xs:group>     

         </xs:schema>

(7)       attributeGroup类型元素

attributeGroup类型与group类型相似,attributeGroup类型主要用于把一组属性组合在一起,以便在复合类型中应用。attributeGroup类型的属性主要的:name、id和ref,“name”属性指示该属性组的名称,如下所示:

         <?xmlversion="1.0" encoding="UTF-8"?>

         <xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"

         elementFormDefault="qualified"attributeFormDefault="unqualified">

                   <xs:attributeGroupname="myGroup">

                            <xs:attributename="id" type="xs:int"/>

                            <xs:attributename="status" type="xs:string"/>

                   </xs:attributeGroup>   

         </xs:schema>

1.6   Schema的数据类型

1.6.1 简单数据类型

Schema定义了多种内置数据类型。我们在编写Schema文件时可以直接使用他们。内置数据类型又分为基本数据类型和派生数据类型。如下表所示:

string

表示字符串

boolean

表示布尔值

decimal

表示任意精度数字

float

表示单精度32位浮点数字

double

表示双精度64位浮点数字

duration

表示持续时间。duration的模式为PnYnMnDTnHnMnS

dateTime

表示时间的特定实例。模式是CCYY-MM-DDThh:mm:ss

time

表示每天重复的时间的实例,模式为hh:mm:ss.sss

date

表示日历日期。模式为CCYY-MM-DD

gYearMonth

表示特定公历年中的特定公历月

gYear

表示公历年

gDay

表示重复的公历日

gM onth

表示每年重复的公历月

hexBinary

表示任意十六进制编码的二进制数据

base64Binary

表示Base64编码的任意二进制数据

anyURI

表示按RFC 2396定义的URI

QName

表示限定名

NOTATION

表示NOTATION属性类型,QNames的集合

1.6.2 派生数据类型

 

由基本数据类型派生出来的数据类型有如下几种:

l ID:用于唯一标识元素

l IDREF:IDREF类型的含义和使用与DTD中的类似。

l IDREFS:IDREFS类型的含义和使用与DTD中的类似。

l ENTITY:实体类型,与DTD中的类似。

l ENTITIES:ENTITIES类型的含义和使用与DTD中的类似。

l NMTOKEN:NMTOKEN类型,与DTD中的类似。

l NMTOKENS:NMTOKENS类型集,与DTD中的类似。

l long:表示长整型数大小在-9223372036854775808和9223372036854775807之间

l int:表示整型数,大小在-2147483648和2147483647之间。

l short:表示短整型数,大小在-32768和32767之间。

l byte:表示整型数,大小在-128和127之间。

 

1.6.3 数据类型的属性

每种数据类型都有不同的属性,数据类型的属性主要包括以下几种:

l enumeration:在指定的数据项中选择,限定用户的选值。

l fractionDigits:限定最大的小数位,用于控制精度。

l length:指定数据的长度。

l maxExclusive:指定数据的最大值,不包含该最大值。

l maxInclusive:指定数据的最大值,包含该最大值。

l maxLength:指定长度的最大值,长度单位取决于数据类型。

l minExclusive:指定最小值,不包含该最小值。该值的数据类型必须与继承               的数据类型相同。

l minInclusive:指定最小值,包含该最小值。

l minLength:指定最小长度。

l pattern:指定数据的显示规范。

1.6.4 用Schema约束XML文档

使用schema合理控制元素之间的关系

元素与元素之间存在着父子关系、包含关系、继承关系等,我们可以通过Schema中定义的各种类型元素来描述元素之间的关系。例如我们可以用complexType和sequence类型来描述父子关系、包含关系,用group类型来描述兄弟关系等。如下:

 

         <!-- “Items”和“item”元素之间存在父子关系-->

         <xs:complexTypename="Items">

                   <xs:sequence>

<!--使用complexType和sequence类型来描述“Items”与“item”元素之间及“item”与"productName”元素之间的父子关系:-->

                            <xs:elementname="item" minOccurs="0"

                            maxOccurs="unbounded">

                            <!--“item”和“productName”元素之间存在父子关系-->

                                     <xs:complexType>

                                               <xs:sequence>

                                               <xs:elementname="productName" type="xs:string"/>

                                               </xs:sequence>

                                     </xs:complexType>

                            </xs:element>

                   </xs:sequence>

         </xs:complexType>

 

在XML文档中使用已经编写好的schema文件的一般格式如下:

<class xmlns="http://tempuri.org/po.xsd"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/po.xsdtest.xsd">

</class>

 

“class”表示根元素,其中xmlns:xsi是在文档中声明“XML 模式实例”名称空间,以授予对引用XML模式时需要的属性的访问权。当然,要添加前缀映射(xsi)和相关URL。xmlns是为所有没有前缀的元素提供缺省命名空间。

 

同时我们可以通过设置schemaLocation属性的值,让该文档应用多个schema文件。schemaLocation属性如下:

<xsi:schemaLocation="http://tempuri.org/po.xsdD:\XML\Schema\test1.xsd

 D:\XML\Schema\test2.xsd">

1.7  XML Schema 中使用名称空间

XML Schema 使用名称空间区分一个文档中引用不同团体创建的同名元素

一个给定的 XMLSchema 定义了一组新名字,如元素名、类型名、属性名、属性组名,这些名字的定义和声明都写在模式中.我们说模式中定义的名字属于它的目标名称空间。

         例如:以下的文档定义的名字包括 InvoiceNo 、ProductID 和 ProductCode 。

<xsd:schema

targetNamespace='http://www.SampleStore.com/Account'   xmlns:xsd='http://www.w3.org/1999/XMLSchema'

  xmlns:ACC= 'http://www.SampleStore.com/Account'>

         <xsd:elementname='InvoiceNo' type='xsd:positive-integer'/> <xsd:element name='ProductID'type='ACC:ProductCode'/> <xsd:simpleType name='ProductCode' base='xsd:string'> <xsd:pattern value='[A-Z]{1}d{6}'/>

         </xsd:simpleType>

</xsd:schema >

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值