XML Schema学习笔记(一)

** 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&lt;SPAN lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-fo</xsd:complextype></xsd:element></xsd:element>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus