** XML Schema ** ** 学习笔记 ** ** **
** ** 张小根
1 、复杂类型和简单类型之间最根本的区别就是:复杂类型的内容中可以包含其他元素,也可以带有属性( Attribute ) , 但简单类型既不能包含子元素,也不能带有任何属性。
1<xsd:complextype name="CNAddress">
2<xsd:sequence>
3<xsd:element name="name" type="xsd:string"></xsd:element>
4<xsd:element name="street" type="xsd:string"></xsd:element>
5<xsd:element name="city" type="xsd:string"></xsd:element>
6<xsd:element name="zip" type="xsd:decimal"></xsd:element>
7</xsd:sequence>
8<xsd:attribute fixed="US" name="country" type="xsd:NMTOKEN"></xsd:attribute>
9</xsd:complextype>
2 、 element 存在约束: element 可以通过其 minOccurs 和 maxOccurs 两个属性来约束元素实例存在的个数,这两个属性的缺省值都是 1 ,表示默认情况下此元素在 XML 实例文档中必须出现一次。
3 、 attribute 存在约束:元素属性也可以通过 attribute 的 use 属性来约束出现一次或根本不出现; use 属性的取值可以是 required,optional,prohibited 三个值,缺省(默认)值是 optional.
4 、 element 和 attribute 都有一个 default 和 fixed 属性,针对 element 来书,只有当 element 实例为空时才采用此 default 值,而 attribute 是当实例不提供此 attribute 时才采用此 default 值,因此对 attribute 而言,只有其 use 值是 optional 时 default 值才有意义,而且对 element 和 attribute 来说 fixed 和 default 两个属性不能同时存在,否则会出现错误。
5 、直接定义在 schema 元素下,即 schema 元素的顶级子元素的 element 和 attribute 都是全局的,称之为全局元素和全局属性,你在其他类型定义中可以直接引用。
6 、派生新类型有两种方式:第一种就是直接从其他类型中扩展(继承)而来,另外一种就是通过对已有类型进行限定性约束而来。
如:以下有三种通过限定性约束定义的新类型:
通过值范围限定:
1<xsd:simpletype name="myInteger">
2<xsd:restriction base="xsd:integer">
3<xsd:mininclusive value="10000"></xsd:mininclusive>
4<xsd:maxinclusive value="99999"></xsd:maxinclusive>
5</xsd:restriction>
6</xsd:simpletype>
使用模式匹配限定:
1<xsd:simpletype name="SKU">
2<xsd:restriction base="xsd:string">
3<xsd:pattern value="\d{3}-[A-Z]{2}"></xsd:pattern>
4</xsd:restriction>
5</xsd:simpletype>
使用枚举方式限定:
1<xsd:simpletype name="CNCity">
2<xsd:restriction base="xsd:string">
3<xsd:enumeration value=" BeiJing "></xsd:enumeration>
4<xsd:enumeration value=" NanChang "></xsd:enumeration>
5<xsd:enumeration value=" ShangHai "></xsd:enumeration>
6</xsd:restriction>
7</xsd:simpletype>
7 、原子类型(不可分割的类型,象 string,integer 等系统内建的类型)、列表类型、联合类型合起来统一称为简单类型。在 Schema 中有 NMTOKENS 、 IDREFS 、 ENTITIES 三种内建的列表类型,你也可以从已有的简单类型来创建 list( 列表 ) 类型,但你不能从已有的 list 类型和复杂类型来创建列表( list )类型。
如:
1<xsd:simpletype name="listOfMyIntType">
2<xsd:list itemtype="myInteger"></xsd:list>
3</xsd:simpletype>
在 XML 实例文档中列表类型的值是通过空格来进行分隔的,如果声明了一个 listOfMyIntType
元素,其值可能是:
1<listofmyint>20003 15037 95977 95945</listofmyint>
8 、有几个方面的元素可以应用于 list 类型来进行约束,它们是: length 、 minLength 、 maxLength 和 enumeration ,如:
1<xsd:simpletype name="USStateList">
2<xsd:list itemtype="USState"></xsd:list>
3</xsd:simpletype>
1<xsd:simpletype name="SixUSStates">
2<xsd:restriction base="USStateList">
3<xsd:length value="6"></xsd:length>
4</xsd:restriction>
5</xsd:simpletype>
注:针对列表类型要千万注意成员是 string 类型的,因为 string 类型中的空格和列表类型的分割符空格会造成部分混淆。
9 、对元素的定义可以采用通过指定其 type 属性为已定义的属性的方式,也可一采用匿名定义类型的方式,如:
采用类型定义:
1<xsd:element name="”comment”" type="”xsd:string”">
2
3采用匿名定义:
4
5<xsd:element name="”quantity”">
6<xsd:simpletype>
7<xsd:restriction base="”xsd:positiveInteger”">
8<xsd:maxexclusive 100”="" value="”"></xsd:maxexclusive>
9</xsd:restriction>
10</xsd:simpletype>
11</xsd:element>
12
1310 、 union (联合)类型表示在 XML 实例文档中的元素实例符合 union 类型定义的成员类型中的一种就可以了(合法),这一点和 C++ 中的联合类型有类似的概念,如:
14
15<xsd:simpletype name="addrUnion">
16<xsd:union membertypes="xsd:string integer"></xsd:union>
17</xsd:simpletype>
18
1911 、复杂类型一般可以分为三类:第一类是包含字符内容和属性但不包含子元素;第二类是包含属性和子元素但不包含字符数据(字符数据包含在子元素中);第三类是即包含属性和字符内容又包含子元素的;那么如何来定义这三类类型呢?针对第一类可以通过 simpleContent 来实现,第二类可以通过 complexContent 来做到,第三类只需要将 complexType 的属性 mixed 设为 true 就可以了。具体的例子如下:
20
21第一种类型(从一个简单类型扩展而来,增加了属性):
22
23<xsd:element name="internationalPrice">
24<xsd:complextype>
25<xsd:simplecontent>
26<xsd:extension base="xsd:decimal">
27<xsd:attribute name="currency" type="xsd:string"></xsd:attribute>
28</xsd:extension>
29</xsd:simplecontent>
30</xsd:complextype>
31</xsd:element>
32
33第二种类型(有一个 element 和两个 attribute 构成):
34
35<xsd:element name="internationalPrice">
36<xsd:complextype>
37<xsd:complexcontent>
38<xsd:element name="”Country”" type="”xsd:string”"></xsd:element>
39<xsd:attribute name="currency" type="xsd:string"></xsd:attribute>
40<xsd:attribute name="value" type="xsd:decimal"></xsd:attribute>
41</xsd:complexcontent>
42</xsd:complextype>
43</xsd:element>
44
45注意:在这里由于默认情况下缺省是 complexContent ,所以在这里简略的写法是:
46
47<xsd:element name="internationalPrice">
48<xsd:complextype>
49<xsd:element name="”Country”" type="”xsd:string”"></xsd:element>
50<xsd:attribute name="currency" type="xsd:string"></xsd:attribute>
51<xsd:attribute name="value" type="xsd:decimal"></xsd:attribute>
52
53</xsd:complextype></xsd:element>
54
55第三种类型:
56
57<xsd:element name="letterBody">
58<xsd:complextype mixed="true">
59
60<SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-fo</xsd:complextype></xsd:element></xsd:element>