Schema的基本概念
    是万维网协会推出的能够描述、约束和检查XML文档的新方法,它提供了更强大的功能,也是DTD的替代者。
    与DTD 相比Schema的优势:
    1.Schema可以针对未来的需求进行扩展;
    2.Schema更加完善,功能也更强大;
    3.Schema是基于XML编写的;
    4.支持数据类型;
    5.支持命名空间;
    Schema建议规范中有两个基础的命名空间:
    一个是用于Schema文档的Schema URI,即http://www.w3.org/2001/XMLSchema。通常使用xs来代表该命名空间。
    另一个用于xml文档,即http://www.w3.org/2001/XMLSchema-instance,通常使用xsi来代笔该命名空间。
    Schema文件
    XML Schema本身也是一个XML文件,因为该文件必须有一个根元素。
    每个Schema文件定义都以一个根元素xs:schema开始,该元素是属于http://www.w3.org/2001/XMLSchema名称空间的。
    Schema的引用方法:
    当XML引入XML Schema时,根据XML文档的元素是否属于某个特定命名空间的,可以按照如下两种方式引入:
    不属于特定的命名空间,通过属性xsi:noNamespaceSchemaLocation引入
    如果被引入的Schema文件需要约束XML文件中不属于任何特定命名空间元素,使用上面的属性引入;
    属于特定的命名空间,通过属性xsi:shemaLocation引入
    如果被引入的Schema文件需要约束XML文件中属于某个特定命名空间的元素,使用上面的属性引入。
    语法如下:

    1. <根元素名称[xmlns:命名空间别名="命名空间URI"]+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="[命名空间URI Schema文件路径]+">

    xsi:schemaLocation=”[命名空间URI Schema文件路径]+”:该属性值比较灵活,可以同时引入多个Schema文件。每一个Schema的引入都需要一个命名空间URI和Schema文件路径,命名空间URI和Schema文件路径中间使用空格间隔。
    image.png
    语法结构:

    1. <?xml version="1.0" encoding="gb2312"?>
    2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    3. ......[元素、属性、注释、数据类型、schema的复用]
    4. </xs:schema>

    除此之外还可以为该元素指定两个属性:
    elementFormDefault:该属性值可以是qualified或unqualified,用于指定XML文档使用该Schema中定义的局部元素时是否必须用命名空间限定。
    attributeFormDefault:该属性值可以是qualified或unqualified,用于指定XML文档使用该Schema中定义的局部属性时是否必须用命名空间限定。
    元素
    简单元素:不包含属性和子元素
    复杂元素:
    全局元素:
    局部元素:定义在复杂类型中的元素
    Schema中定义元素的语法主要包括以下三类:
    语法1:

    1. <element name="元素名称" type="数据类型" [default="默认值"] [minOccurs="最少出现的次数"] [maxOccurs="最多出现的次数"]/>

    语法2:

    1. <element name="元素名称" [default="默认值"] [minOccurs="最少出现的次数"] [maxOccurs="最多出现的次数"]>
    2. Elementtype
    3. </Element>

    语法3:

    1. <element ref="引用元素名称" [default="默认值"] [minOccurs="最少出现的次数"] [maxOccurs="最多出现的次数"]/>

    属性说明:
    name:由程序员制定,元素的名字
    type:元素的数据类型
    default:该元素的默认值,该属性是可选的。
    minOccurs:指定该元素出现的最少次数,默认值为1.该属性是可选的。如果属性值为0则表示该元素的可选的;如果大雨0,则该元素是强制出现的。如果minOccurs没有与maxOccurs同时出现,则该属性值只能为0或1.
    maxOccurs:该元素出现的最大次数,默认值为1。该属性是可选的。如果指定该元素可以出现任意多次,则该属性值为“unbounded”;如果minOccurs没有与maxOccurs同时出现,则该属性值不能为0.
    ref:引用的元素名称。
    元素补充说明:
    根据元素所出现的位置,元素还可以划分为全局元素和局部元素,在schema元素中定义的元素称为全局元素,全局元素可以被其他的任意元素所引用。局部元素实在复杂类型中定义的元素,局部元素仅能在定义该元素的外部元素中使用。
    在元素声明中还可以定义元素组,元素组是把多个元素及其约束组合在一起,使用时作为一个整体。元素组能更好地实现复用。
    元素组定义的语法:

    1. <xs:group name="元素组名称">包含多个元素及约束</xs:group>

    引用语法:

    1. <xs:group ref="元素组名称">

    属性定义的语法如下所示:
    语法1:属性定义

    1. <xs:attribute name="属性名" type="属性类型" [default="默认值"]|[fixed="固定值"]>

    语法2:属性调用

    1. <xs:attribute ref="属性名"></xs:attribute>

    属性说明如下:
    name:XML元素的属性名
    type:属性的数据类型,可以使用内置数据类型或simpleType元素定义的数据类型
    default:属性的默认值,该属性可选(不能与fixed属性同时存在)
    ref:引用已经定义好的属性名称
    use:只能在所属元素确定后才能使用,选项optional表示可选属性,设默认值prohibited被禁止的属性required是必须属性。
    属性补充说明:全局属性与局部属性
    与元素声明类似,在schema元素中定义的属性为全局属性,全局属性可以被其他任意元素引用。在复杂属性中定义的属性为局部属性,局部属性只能在定义该属性的元素中使用。参见文件:attdemo.xsd及其约束的xml文档。
    属性组是把多个属性作为一个属性组,在使用时仅需引用该属性组即可引用属性组中的所有属性。通过定义属性组可以更好实现复用。
    定义属性组的语法:

    1. <xs:attributeGroup name="属性组名称">包含多个属性</xs:attributeGroup>

    引用属性组的语法:

    1. <xs:attributeGroup ref="属性组名称">

    注释:
    1.XML语法中的注释

    1. <!--注释的内容-->

    2.通过标记来增加注释,该方式具有更好的可读性。
    :通常放在各种Schema组建定义的开始部分,用于说明该Schema组建的作用。内部可以出现多个而且顺序和出现次数没有限制。
    :该子元素的注释主要供人来阅读
    :该子元素的注释主要供其他程序来使用。
    数据类型:
    image.png
    Schema的数据类型可以根据该元素内容划分为简单类型和复杂类型
    简单类型是指元素的内容既不包括子元素也不包括属性
    复杂数据类型是指元素的内容中包括子元素、包括属性或既包括子元素也包括属性
    Schema允许用户根据实际需要扩展数据类型。因此按照扩展方式可以分为:
    内置数据类型
    内置数据类型是被预先定义好的,这些数据类型全部位于命名空间http://www.w3.org/2001/XMLSchema下,所有的内置数据类型都是简单类型,既可以做元素的数据类型,也可以做属性的数据类型。内置数据类型又分为内置基本数据类型和内置扩展数据类型,其中后者是在前者基础上发展过来的。image.png
    内置数据类型分为3各部分:
    任意类型(其他内置数据类型都源自任意类型)包括两种:
    anyType:表示该元素为任意类型,与DTD的ANY类似。此类型对于元素的内容没有任何约束。
    anySimpleType:表示该元素为任意简单类型。即定义为该类型的元素除不能包含子元素和属性外,没有任何其他的约束。
    内置基本数据类型
    字符串及相关类型
    string:表示字符串,原封不动保留所有空白
    QName:表示一个包含XML命名空间在内的名称
    数值类型:
    decimal:表示特定精度的数字
    float:表示单精度32位浮点数,支持科学计数法
    double:表示双精度64位浮点数,支持科学计数法
    haxBinary:表示十六进制数
    日期类型:
    date:表示日期YYYY-MM-DD格式的时间
    gYearMonth:表示年月YYYY-MM格式的时间
    gYear:表示年YYYY格式的时间
    gMonthDay:表示月日MM-DD格式的时间
    getDay:表示日期DD格式的时间
    getMonth:表示月份MM格式的时间
    时间类型:
    duration:表示持续时间PnYnMnDTnHnMnS,P其实定界符,T分隔符,s前面的n可以是小数
    dateTime:表示特定的时间YYYY-MM-DDThh:mm:ss:sss,sss表示毫秒数
    time:表示特定的时间hh:mm:ss:sss,sss表示毫秒数
    boolean类型
    boolean:布尔型,只能接受true、false、0、1
    anyURI:表示一个URI,用来定位文件
    二进制数据类型
    base64Binary:表示任意base64编码的二进制数
    hexBinary:表示任意16进制编码的二进制数
    Notation类型
    NOTATION:表示在XML中的NOTATION类型,不能在模式中直接出现的抽象类型,只能用于派生其他类型
    内置扩展数据类型(两个扩展点:string、decimal)
    String类型派生出来用于约束属性的类型及其描述(只能约束属性,功能与DTD保持一致)
    NMTOKEN必须是合法的XML名称,只能由字母、数字、”_”、”-“、”.”、”:”组成
    NMTOKEN多个NMTOKEN,空格为分隔符
    ID标识符
    IDREF引用另一个ID
    IDREFS引用多个已有的ID,空格为分隔符
    ENTITY外部实体
    ENTITIES多个外部实体,空格为分隔符
    String类型派生出来的其他类型及其描述
    normalizedString:将字符串内容包含的换行、制表符和回车符都替换成空白
    token:将字符串内容包含的换行、制表符和回车符都替换成空白,自动删除字符串前后的空白,如果字符串中间包含多个连续的空白,则会被压缩成一个空白
    language:定义合法的语言代码
    Name:含有一个有效的XML名称的字符串
    NCName:省略或不带有命名空间前缀的XML名称字符串,不含冒号
    decimal类型派生出来的类型及其描述:

    数据类型 描述 最小值 最大值
    integer 无限制的整数 无限制 无限制
    nonNegativeInteger 无限制的非负整数 0 无限制
    nonPositiveInteger 无限制的非负正数 无限制 0
    long 64位的有符号整数 -2^63 (2^63)-1
    positiveInteger 无限制的正整数 1 无限制
    negetiveInteger 无限制的负整数 无限制 -1
    unsignedLong 64位的无符号整数 0 (2^64)-1
    int 32位的有符号整数 -2^31 (2^31)-1
    unsignedInt 32位的无符号整数 0 (2^32)-1
    short 16位有符号整数 -2^15 (2^15)-1
    unsignedShort 16位无符号整数 0 (2^16)-1
    byte 8位有符号整数 -2^31 (2^7)-1
    unsignedByte 8位无符号整数 0 (2^8)-1

    用户自定义数据类型:
    用户自定义的基本数据类型和用户自定义的复杂数据类型。所有的复杂数据类型都是用户自定义得到的。按照位置可以分为全局类型和局部类型:全局类型是在scheme标记内定义的类型,该类型可以被所有元素使用;局部类型是定义在某个元素内部的类型,该类型只能被定义该类型的元素所引用。按照复杂程度划分,分为简单类型和复杂类型。
    自定义简单数据类型:
    自定义简单类型是在内置数据类型的基础上通过限制、列表和联合中一种或多种方式形成的新数据类型。简单数据类型的定义语法:

    1. <xs:simpleType [name="自定义类型名称"]>[限制、列表、联合一种或几种方式]</xs:simpleType>

    name属性:自定义的数据类型名称。当定义的简单数据类型为全局数据类型,即直接在标记中定义,必须写出该属性。如果为局部数据类型,则没有该属性。
    限制:
    如果通过限制方式产生自定义类型,需要使用的标记为restriction,语法如下:

    1. <xs:simpleType [name="自定义类型名称"]>
    2. <xs:restriction base="基类型">
    3. [约束特征]+
    4. </xs:restriction>
    5. </xs:simpleType>

    Base属性值为前面定义的内置数据类型,约束特征主要包括以下几种类型:
    范围说明:在实际应用中,往往需要把某个值限定在一定的范围内,如雇员的年龄在18-60之间,分数在0-100之间等。minlnclusive(最小包含,相当于>=),maxlnclusive(最大包含,相当于<=),minExclusive(最小不包含,相当于>),maxExclusive(最大不包含,相当于<)。这4个范围面只能适用于整数、日期、时间类型。
    长度说明:限制值的长度,比如需要限制密码的长度为8位,用户名的长度为6到20位。length:内容长度、minLength:最小长度、maxLength:最大长度。主要使用的类型为字符型、QName型、AnyURI型。不可以适用于日期、时间、数字和boolean。length不能与minLength、maxLength一起使用。
    精度说明:在某些情况下,需要限定某个数的数字位数,比如支票上的最大单位是亿,最小的单位是分。totoalDigits:总数字、fractionDigits:分数数字(小数点后面的)。
    枚举说明:经常将某个值限定在一组可选的值之中,比如性别要在“男”和“女”之间进行选择。enumeration:枚举。enumeration可以在除boolean以后的其他类型中使用。
    模式匹配:有时候需要复杂的格式约束,比如需要对邮件地址的格式进行检查。可以使用pattern面进行正则表达式的限制。
    空白处理:
    whitespace的有效值为:preserve、replace、collapse。
    preserve:所有的空白都被保留:
    replace:制表符、换行、回车都用一个空格进行替换,但连续的空格不被压缩为一个空格。
    collapse:制表符、换行、回车都被空格替换,连续的空格被压缩为一个空格。
    列表:
    Schema中定义列表类型使用元素,它可以由单个数据类型扩展出列表类型,因此使用该元素时必须指出列表元素的类型,为元素指定列表元素有两种方式:
    1.为元素的itemType属性指定列表元素的数据类型:

    1. <xs:simpleType [name="自定义类型名称"]>
    2. <xs:list itemType="列表元素类型"></xs:list>
    3. </xs:simpleType>

    2.为元素增加子元素类指定列表元素的数据类型:

    1. <xs:simpleType [name="自定义类型名称"]>
    2. <xs:list>
    3. <simpleType.../>
    4. </xs:list>
    5. </xs:simpleType>

    Schema使用元素将多个简单类型联合成新的类型,为元素指定简单类型有两种方式:
    1.为元素的memberTypes属性指定一个或多个简单类型,多个简单类型之间以空格隔开。

    1. <xs:simpleType [name="自定义类型名称"]>
    2. <xs:union memberTypes="[列表元素类型]+"></xs:union>
    3. </xs:simpleType>

    2.为元素增加一个或多个子元素,每个子元素指定一个简单类型。

    1. <xs:simpleType [name=""]>
    2. <xs:union>
    3. [<simpleType.../>]+
    4. </xs:union>
    5. </xs:simpleType>

    复杂类型所约束的内容可能包含属性、子元素或同时包含子元素和属性。复杂元素也有可能包含子元素的同时包含字符内容,这样的元素被称为混合内容。定义复杂元素的语法格式如下所示:

    1. <xs:complexType [name=""] [mixed="true|false"]>
    2. [顺序、选择、无序、简单内容、复杂内容]+
    3. </xs:complexType>

    name属性:自定义的数据类型名称。当定义饿简单数据类型为全局数据类型,即直接在标记中定义,必须写出该属性。如果为局部数据类型,则没有该属性值。
    mixed属性:如果mixed属性值设置为true,则表示该元素的内容为混合内容。该属性默认值为false。
    顺序
    使用该元素定义的数据类型用于设定子元素的顺序,表示该元素的子元素是有序的。使用该元素的语法格式如下:

    1. <xs:complexType name="">
    2. <xs:sequence [maxOccurs="最多出现的次数"][minOccurs="最少出现的次数"]>
    3. [<xs:element name="test" type="xs:string" minOccurs="最少出现的次数" maxOccurs="最多出现的次数"></xs:element>]+
    4. </xs:sequence>
    5. </xs:complexType>

    maxOccurs属性:最多出现的次数,通常为一个固定的数字。可以作为sequence的属性,也可以作为element的属性。当最多次数没有限制时该值为unbounded。
    minOccurs属性:最少出现的次数,为一个固定的数字。可以作为sequence的属性,也可以作为element的属性。
    选择
    使用该元素定义的数据类型用于设定子元素的选择关系,表示该元素的子元素可以根据实际需要从子元素中选择一个使用。使用该元素的语法格式如下:

    1. <xs:complexType>
    2. <xs:choice [maxOccurs=""] [minOccurs=""]>
    3. [<xs:element name="test" type="string" minOccurs="min" maxOccurs="max"></xs:element>]+
    4. </xs:choice>
    5. </xs:complexType>

    无序
    使用元素定义的数据类型用于设定子元素是没有顺序的,表示该元素得子元素是无序的。但是该元素设定中有一些约束子元素数量不能被设定,只能是一个;也不能增加属性;不能与同时出现;只能作为的顶级元素。语法如下:

    1. <xs:complexType name="mytype">
    2. <xs:all minOccurs="" maxOccurs="1">
    3. [<xs:element minOccurs="" maxOccurs="" default=""></xs:element>]+
    4. </xs:all>
    5. </xs:complexType>

    maxOccurs属性:此时该值可以为0或1;
    minOccurs属性:此时该值只能在0或1。
    简单内容
    如果元素只包含属性,不包含子元素,则可以使用该元素定义元素内容。具体的内容方式包括在基类型上扩展和限制两种方式:
    限制:基类型必须为一个仅包含属性的简单类型。该标记中可以嵌套基于restriction元素内的所有特征元素,对当前的基类型进行限制。
    扩展:基类型必须为一个简单类型,该元素内可以包含属性的定义,再简单内容的基础上增加属性。
    复杂内容
    使用该元素有点类似于编程语言的继承,相当于在某一基类型的基础上进行扩展或限制。如果元素包含子元素(是否包含属性不限制),则可以使用该元素对元素内容进行定义。
    限制:基类型为一个已经定义好的复杂数据类型,在基类型的基础上增加限制。
    扩展
    :基类型为一个已经定义好的复杂数据类型。在基类型的基础上扩展,可以既增加子元素,也可以增加属性。