课外天地 李树青学习天地数据库系统原理课件 → [推荐]XML学习资料之三——Schema


  共有17769人关注过本帖树形打印复制链接

主题:[推荐]XML学习资料之三——Schema

帅哥哟,离线,有人找我吗?
admin
  1楼 博客 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 管理员
等级:管理员 帖子:1938 积分:26572 威望:0 精华:34 注册:2003/12/30 16:34:32
[推荐]XML学习资料之三——Schema  发帖心情 Post By:2008/2/20 15:20:43 [只看该作者]

1 简介
Schema使用XML文档一致的规范方式来对定义其他XML文档结构,较DTD方式优势更多,如:数据类型丰富、格式语法与XML文档一致、可以对数据类型进行扩展和限制、同命名空间结合更为紧密(使得一个XML文件可以有多个对应的Schema)

可以将XML文件的Schema文件保存为xsd文件。

此时,Schema文件的引用方式有固定的格式
如Schema文件为:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="students">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="student" type="xs:string" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>a</student>
<student>b</student>
</students>

2 基本元素
2、1 Schema根元素
任何Schema文档的元素都是Schema根元素的子元素,其中的xmlns:xs用于表示Schema元素来源的名称空间,如:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

2、2 简单元素
不包含子元素和属性,使用element来声明,type属性为数据类型,如:
<xs:element name="birthday" type="xs:date"/>

2、3 包含子元素的元素
包含子元素和属性,使用element来声明,无需指定type属性,如:
<xs:element name="sgrade">
<xs:complexType>
  <xs:sequence>
   <xs:element ref="number"/>
   <xs:element ref="course"/>
   <xs:element ref="grade"/>
  </xs:sequence>
</xs:complexType>
</xs:element>

也可以使用复合自定义数据类型来表示,如:
<xs:complexType name="newtype">
<xs:sequence>
  <xs:element ref="number"/>
  <xs:element ref="course"/>
  <xs:element ref="grade"/>
</xs:sequence>
</xs:complexType>

<xs:element name="sgrade" type="newtype">

2、4 通过元素引用声明的元素
通过ref属性表示引用其他地方已经声明的元素,这个被引用元素必须是Schema元素的直接子元素,通过元素引用声明的元素与被引用元素数据类型相同,如:
<xs:element ref="number"/>

2、5 空元素
内容为空,且没有子元素,使用element来声明,由于没有子元素,所以通常使用属性来表示,如:
<xs:element name="otherNullElement">
<xs:complexType>
  <xs:attribute name="XX"/>
</xs:complexType>
</xs:element>

如果空元素连属性都没有,可以如下表示:
<xs:element name="otherNullElement" nillable="true"/>

2、6 声明混合内容的元素
既可以在元素内放入子元素,也可以放入数据,利用complexType的mixed属性设置为真来表示,如:
<xs:element name="newone">
<xs:complexType mixed="true">
  <xs:sequence>
   <xs:element name="xsname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
</xs:element>

完整的使用方法为:
<?xml version="1.0" encoding="gb2312" standal?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<stu>
  <number>000001</number>
  <name>黎明</name>
  <sex>1</sex>
  <birthday>1976-11-23</birthday>
  <height>1.8</height>
  <newone>
   This is demo
   <xsname>Null</xsname>
  </newone>
  <sgrade>
   <number>000001</number>
   <course>A03</course>
   <grade>56</grade>
  </sgrade>
  <sgrade>
   <number>000001</number>
   <course>B01</course>
   <grade>78</grade>
  </sgrade>
</stu>
</students>

相应的Schema文件为stu.xsd,内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XMLSPY v5 rel. 4 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="newone">
  <xs:complexType mixed="true">
   <xs:sequence>
    <xs:element name="xsname" type="xs:string"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="birthday" type="xs:date"/>
<xs:element name="course">
  <xs:simpleType>
   <xs:restriction base="xs:hexBinary">
    <xs:enumeration value="A03"/>
    <xs:enumeration value="B01"/>
   </xs:restriction>
  </xs:simpleType>
</xs:element>
<xs:element name="grade">
  <xs:simpleType>
   <xs:restriction base="xs:byte">
    <xs:enumeration value="56"/>
    <xs:enumeration value="78"/>
   </xs:restriction>
  </xs:simpleType>
</xs:element>
<xs:element name="height" type="xs:decimal"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="number" type="xs:byte"/>
<xs:element name="sex" type="xs:boolean"/>
<xs:complexType name="sgradeType">
  <xs:sequence>
   <xs:element ref="number"/>
   <xs:element ref="course"/>
   <xs:element ref="grade"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="stuType">
  <xs:sequence>
   <xs:element ref="number"/>
   <xs:element ref="name"/>
   <xs:element ref="sex"/>
   <xs:element ref="birthday"/>
   <xs:element ref="height"/>
   <xs:element ref="newone"/>
   <xs:element name="sgrade" type="sgradeType" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="students">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="stu" type="stuType"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

2、7 使用ANY内容的元素
这种元素可以出现任何内建数据类型数据和自定义数据类型数据
<xs:element name="newone"/>

有些声明可以写为:
<xs:element name="newone" type="xs:anytype"/>

2、8 元素出现的限制
类似于DTD中的元素出现限制符号,Schema使用element元素的minOccurs属性和maxOccurs属性来控制元素的出现次数,minOccurs属性决定最小出现次数,maxOccurs属性决定最大出现次数,它们的值为非负整数,或者为“unbounded”表示不限制次数,默认都为1。

default属性指定默认值,如果不存在该元素,不进行处理

fixed属性指定元素值必须为fixed属性的值,如果不存在该元素,则自动创建该元素并赋此值

注意:default属性和fixed属性不能同时对同一个元素设置,它们是彼此矛盾的

2、9 元素出现的顺序
Schema使用sequence元素和all元素来控制子元素的出现顺序,sequence元素中的子元素必须按照声明的顺序出现在XMl文档中,all元素中的子元素可以按任意顺序出现在XMl文档中,但是此时这些元素的maxOccurs必须为1,而且这些子元素是独立的而不是元素组。

2、10 选择型子元素
使用choice来声明选择型的子元素,实际使用时从多个子元素的定义中选取一个而且只能是一个子元素。
如:
<xs:element name="newone">
<xs:complexType>
  <xs:choice>
   <xs:element name="xsname1" type="xs:string"/>
   <xs:element name="xsname2" type="xs:string"/>
   <xs:element name="xsname3" type="xs:string"/>
  </xs:choice>
</xs:complexType>
</xs:element>

相应的XML文档为:
<newone>
<xsname2>Null</xsname2>
</newone>

2、11 声明元素组
可以同时声明一组元素并一齐用于其他元素内部子元素的声明上,如一般没有使用元素组的声明为:
<xs:element name="newone">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="xsname1" type="xs:string"/>
    <xs:element name="xsname2" type="xs:string"/>
    <xs:element name="xsname3" type="xs:string"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
使用元素组的声明为:
<xs:group name="threeNode">
  <xs:sequence>
    <xs:element name="xsname1" type="xs:string"/>
    <xs:element name="xsname2" type="xs:string"/>
    <xs:element name="xsname3" type="xs:string"/>
  </xs:sequence>
</xs:group>
    
<xs:element name="newone">
  <xs:complexType>
   <xs:sequence>
    <xs:group ref="threeNode"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>

相应的XML文件为:
  <newone>
   <xsname1>Null</xsname1>
   <xsname2>Null</xsname2>
   <xsname3>Null</xsname3>
  </newone>

2、12 ANY元素
可以替换为任意类型的元素,如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="person">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:any minOccurs="0"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="children">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="childname" type="xs:string" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<firstname>Hege</firstname>
<lastname>Refsnes</lastname>
<children>
  <childname>Cecilie</childname>
</children>
</person>

3 属性
3、1 元素属性
使用attribute元素实现,属性数据类型为简单类型,没有复杂类型,因为不存在包含子元素或者属性的属性,放入的位置一般在complexType中,通常位于子元素的声明后,如:
<xs:element name="newone">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="newnode" type="xs:string"/>
   </xs:sequence>
   <xs:attribute name="someattr" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

相应的XML文件为:
  <newone someattr="values">
   <newnode>Null</newnode>
  </newone>

虽然属性没有复杂数据类型,但是可以是用户自定义的简单类型,如:
<xs:element name="newone">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="newnode" type="xs:string"/>
   </xs:sequence>
   <xs:attribute name="someattr">
    <xs:simpleType >
     <xs:restriction base="xs:string">
      <xs:enumeration value="1"/>
      <xs:enumeration value="2"/>
      <xs:enumeration value="3"/>
     </xs:restriction>
    </xs:simpleType>
   </xs:attribute>
  </xs:complexType>
</xs:element>

相应的XML文件为:
  <newone someattr="1">
   <newnode>Null</newnode>
  </newone>

3、2 通过引用声明属性
上述代码中的属性可以分开单独定义,通过引用来声明属性,如:
<xs:element name="newone">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="newnode" type="xs:string"/>
   </xs:sequence>
   <xs:attribute ref="someattr"/>
  </xs:complexType>
</xs:element>

<xs:attribute name="someattr">
  <xs:simpleType>
   <xs:restriction base="xs:string">
    <xs:enumeration value="1"/>
    <xs:enumeration value="2"/>
    <xs:enumeration value="3"/>
   </xs:restriction>
  </xs:simpleType>
</xs:attribute>

相应的XML文件为:
  <newone someattr="1">
   <newnode>Null</newnode>
  </newone>

3、3 声明any内容的属性
声明为any的属性可以使得在元素中出现任何已经声明过的属性,如:
<xs:element name="newone">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="newnode" type="xs:string"/>
   </xs:sequence>
   <xs:anyAttribute/>
  </xs:complexType>
</xs:element>

3、4 声明属性分组
利用属性分组可以将许多属性集中建立和被引用,如:
<xs:attributeGroup name="comattr">
  <xs:attribute name="gender">
   <xs:simpleType>
    <xs:restriction base="xs:string">
     <xs:pattern value="male|female"/>
    </xs:restriction>
   </xs:simpleType>
  </xs:attribute>
  <xs:attribute name="someattr">
   <xs:simpleType>
    <xs:restriction base="xs:string">
     <xs:enumeration value="1"/>
     <xs:enumeration value="2"/>
     <xs:enumeration value="3"/>
    </xs:restriction>
   </xs:simpleType>
  </xs:attribute>
</xs:attributeGroup>

相应的XML文件为:
<xs:element name="newone">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="newnode" type="xs:string"/>
   </xs:sequence>
   <xs:attributeGroup ref="comattr"/>
  </xs:complexType>
</xs:element>

3、5 属性出现的限制
属性只能出现或者不出现,不能出现多次的情况。可以attribute使用元素的use属性指定,它的值有required、optional、prohibited,分别代表了必需、可选和禁止。
另外,还有两个常见属性,如:
default属性给出缺省值,当属性不出现时,将自动加上该属性并赋予默认值。
fixed属性指定必须为此值,当属性不出现时,将自动加上该属性并赋予固定值。

4 数据类型
4、1 内建数据类型
标准XML中有44种数据类型,其中19种为基本类型,25种为派生数据类型

4、2 自定义数据类型
4、2、1 facets
自定义数据类型有面(facets)组成,其中的constraining facets可以用于定义数据类型,其中的主要元素有六个:

下面的内容基于如下文档,Schema文件为:
<?xml version="1.0" encoding="UTF-8" standal?>
<!--W3C Schema 由 XMLSpy v2006 U 创建 (http://www.altova.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:element name="name">
  <xs:simpleType>
   <xs:restriction base="xs:string">
   </xs:restriction>
  </xs:simpleType>
</xs:element>
<xs:element name="number">
  <xs:simpleType>
   <xs:restriction base="xs:string">
   </xs:restriction>
  </xs:simpleType>
</xs:element>
<xs:complexType name="studentType">
  <xs:sequence>
   <xs:element ref="number"/>
   <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>
<xs:element name="students">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="student" type="studentType" minOccurs="1" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>
  <number>000001</number>
  <name>黎明</name>
</student>
<student>
  <number>000002</number>
  <name>赵怡春</name>
</student>
<student>
  <number>000003</number>
  <name>张富平</name>
</student>
<student>
  <number>000004</number>
  <name>白丽</name>
</student>
<student>
  <number>000005</number>
  <name>牛玉德</name>
</student>
<student>
  <number>000006</number>
  <name>姚华</name>
</student>
<student>
  <number>000007</number>
  <name>李南</name>
</student>
</students>

1)length
用于定义长度,一般基于字符串类型的数据,如果fixed属性为true,则限制长度必须为规定长度,如:
<xs:simpleType name="newtype">
  <xs:restriction base="xs:string">
   <xs:length value="6" fixed="true"/>
  </xs:restriction>
</xs:simpleType>

基于此数据类型的其他元素可以表达为:
<xs:element name="number">
<xs:simpleType>
   <xs:restriction base="newtype">
   </xs:restriction>
</xs:simpleType>
</xs:element>

2)maxLength minLength
限制数据类型内容的最大和最小长度,注意它们与length不能同时使用,如:
<xs:simpleType name="newtype">
  <xs:restriction base="xs:string">
   <xs:minLength value="1"/>
   <xs:maxLength value="6"/>
  </xs:restriction>
</xs:simpleType>

3)pattern
使用正则表达式来限定内容式样,如必须为六个数字:
<xs:simpleType name="newtype">
  <xs:restriction base="xs:string">
   <xs:minLength value="6"/>
   <xs:maxLength value="6"/>
   <xs:pattern value="\d{6}"/>  
  </xs:restriction>
</xs:simpleType>

另外,下面表示前面三个数字,加一个分隔符,再加两个大写字母
   <xs:pattern value="\d{3}-[A-Z]{2}"/>
  
4)enumeration
用来限制取值的范围集合,如:
<xs:simpleType name="newtype">
  <xs:restriction base="xs:string">
   <xs:minLength value="6"/>
   <xs:maxLength value="6"/>
   <xs:pattern value="\d{6}"/>
   <xs:enumeration value="000001"/>
    <xs:enumeration value="000002"/>
    <xs:enumeration value="000003"/>
    <xs:enumeration value="000004"/>
    <xs:enumeration value="000005"/>
    <xs:enumeration value="000006"/>
    <xs:enumeration value="000007"/>
  </xs:restriction>
</xs:simpleType>

5)whitespace
用于处理数据中的空白,如:
<xs:simpleType name="newtype">
  <xs:restriction base="xs:string">
   <xs:minLength value="6"/>
   <xs:maxLength value="6"/>
   <xs:whiteSpace value="collapse"/>
  </xs:restriction>
</xs:simpleType>

value属性为collapse表示去掉首尾空格,并合并多个连续空格
value属性为preserve表示不对空格作任何处理
value属性为replace表示所有的制表符、换行和回车都用空格替代

此时下面的XML格式正确,如:
<student>
  <number>01  003</number>
  <name>张富平</name>
</student>

6)maxInclusive minInclusive
用于指定数据内容的范围,分别为最大值和最小值

4、2、2 派生数据类型
分为简单类型和复杂类型,前者只能包含字符数据,不能有子元素和属性,后者相反。内建类型都是简单类型,自定义类型可以是复杂类型。

4、2、2、1 派生简单数据类型
基本结构为:
<xs:simpleType name="newtype">
  <xs:restriction base="xs:string">
   facets...
  </xs:restriction>
</xs:simpleType>

使用多个简单类型可以合并为一个简单类型,如:
<xs:simpleType name="newtype1">
  <xs:restriction base="xs:string">
   <xs:minLength value="3"/>
   <xs:maxLength value="3"/>
   <xs:whiteSpace value="replace"/>
  </xs:restriction>
</xs:simpleType>
<xs:simpleType name="newtype2">
  <xs:restriction base="xs:string">
   <xs:minLength value="6"/>
   <xs:maxLength value="6"/>
   <xs:whiteSpace value="replace"/>
  </xs:restriction>
</xs:simpleType>
<xs:simpleType name="newtype">
  <xs:union memberTypes="newtype1 newtype2"/>
</xs:simpleType>

相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>
<number>112</number>
</student>
<student>
  <number>000002</number>
</student>
</students>

上述合并写法也可以为:
<xs:simpleType name="newtype">
  <xs:union>
   <xs:simpleType>
    <xs:restriction base="xs:string">
     <xs:minLength value="3"/>
     <xs:maxLength value="3"/>
     <xs:whiteSpace value="replace"/>
    </xs:restriction>
   </xs:simpleType>
   <xs:simpleType>
    <xs:restriction base="xs:string">
     <xs:minLength value="6"/>
     <xs:maxLength value="6"/>
     <xs:whiteSpace value="replace"/>
    </xs:restriction>
   </xs:simpleType>  
  </xs:union>
</xs:simpleType>

也可以使用列表类型,可以用于取各种枚举值,如:
<xs:simpleType name="newtype">
  <xs:list itemType="xs:integer"/>
</xs:simpleType>

相应的XML文件为:
<student>
  <number>112 32</number>
</student>

4、2、2、2 派生复杂数据类型
可以包含子元素和属性,可以通过扩展已有的简单数据类型和复合类型来实现。
对于扩展已有的简单数据类型,可以增加新的属性,如:
<xs:complexType name="newtype">
  <xs:simpleContent>
   <xs:extension base="xs:string">
    <xs:attribute name="length" type="xs:integer" use="required"></xs:attribute>
   </xs:extension>
  </xs:simpleContent>
</xs:complexType>

<xs:element name="number" type="newtype">
</xs:element>

相应的XML文件为:
<student>
  <number length="6">000001</number>
  <name>黎明</name>
</student>
<student>
  <number length="6">000002</number>
  <name>赵怡春</name>
</student>

对于复合类型可以包含多种其他类型,如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="student">
  <xs:complexType>
   <xs:sequence>
    <xs:element name="number" type="xs:string">
    </xs:element>
    <xs:element name="name" type="xs:string">
    </xs:element>
   </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:element name="students">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="student" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

也可以写成分离的数据类型定义方式,如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:complexType name="newtype">
   <xs:sequence>
    <xs:element name="number" type="xs:string">
    </xs:element>
    <xs:element name="name" type="xs:string">
    </xs:element>
   </xs:sequence>
  </xs:complexType>

<xs:element name="student" type="newtype">  
</xs:element>

<xs:element name="students">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="student" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>
  <number>000001</number>
  <name>黎明</name>
</student>
<student>
  <number>000002</number>
  <name>赵怡春</name>
</student>
</students>

也可以扩展其他类型,如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:complexType name="newtype">
  <xs:sequence>
   <xs:element name="number" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="finalnewtype">
  <xs:complexContent>
   <xs:extension base="newtype">
    <xs:sequence>
     <xs:element name="name" type="xs:string"/>
    </xs:sequence>
   </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:element name="student" type="finalnewtype"/>
<xs:element name="students">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="student" maxOccurs="unbounded"/>
   </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>
  <number>000001</number>
  <name>黎明</name>
</student>
<student>
  <number>000002</number>
  <name>赵怡春</name>
</student>
</students>

[此贴子已经被作者于2010-12-11 19:54:11编辑过]

 回到顶部