-- 作者:admin
-- 发布时间:2008/2/20 15:20:43
-- [推荐]XML学习资料之三——Schema
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编辑过]
|