Posted on 2008-10-22 17:11 
semovy 阅读(393) 
评论(0)  编辑  收藏  所属分类: 
XML相关 
			
			
		 
		为何需要XML Schema  
在当今的IT行业中,XML被赋予了越来越多的职责和功能,例如,作为文本数据库存储数据,作为某一行业中数据交换的标准表示,等等。这些都需要相应的XML文件中对数据的描述,如数据类型、长度进行严格的定义,这样才能真正做到数据的安全性和行业统一标准并有通用的规则对其进行解析。 
然而,XML在其产生的时候就被定义为高开放性,用文本方式浏览,用标签来定义的标记语言,鉴于XML的这些特点,就像HTML文件一样,XML文件本身无法对文件中的数据进行严格的定义。 
为了解决以上的矛盾,XML Schema应运而生了,它是用来定义XML文件的文本结构,数据类型等XML文件描述规则的。 
何为XML Schema  
其实,XML Schema本身也是一个xml文件,所不同的是,Schema文件所描述的是对引用它的xml文件的element和attribute的具体类型的。作为一个Schema文件,其特殊的文件头格式为: 
<?xml version="1.0"?>ß ------------------------------------------xml文件头 
<Schema name="schema_sample_1" ß ------------------------ 名称(可省略) 
xmlns="urn:schemas-microsoft-com:xml-data" ß --------- 引用微软Schema类型定义(可省略) 
xmlns:dt="urn:schemas-microsoft-com:datatypes">ß -----引用微软Schema数据类型定义(可省略) 
<!--…………..- 〉 ß ---------------------------------------------- 具体文件内容 
</Schema> 
必须注意的是,在一个定义Schema的xml文件中,文件的root一定为<Schema>…</Schema>, 
在文件的具体内容中,你可以添加你对某个xml结构、数据类型的定义,请看下例: 
<?xml version="1.0"?> 
<catalog> 
<book> 
<title>Presenting XML</title> 
<author>Richard Light</author> 
<pages>334</pages> 
</book> 
<book> 
<title>XML</title> 
<author>Jane Lee</author> 
<pages>450</pages> 
</book> 
</catalog> 
这是一个表示书目录的xml文件,对每一本书的介绍,我们都要有一些数据上的规定,如,“书名”、“作者名”和“页数”都应该是唯一的,“作者名”应该为字符串类型,而“页数”应该为整数类型的,对每本“book”来说,只能有所指定的三个元素。 
为了能实现上述要求,我们定义了如下schema: 
<?xml version="1.0"?> 
<Schema> 
<ElementType name="title" content="textOnly" model="closed" /> 
<ElementType name="author" content="textOnly" dt:type=”string” model="closed" /> 
<ElementType name="pages" content="textOnly" dt:type=”int” model="closed" /> 
<ElementType name="book" content="eltOnly" model="closed" order=”seq”> 
<element type="title" /> 
<element type="author" /> 
<element type="pages" />  
</ElementType> 
</Schema> 
在以下的文章中,将详细的描述内容中的具体意义。 
ElementType  
ElementType是schema中最基本的,它用来定义xml文件中元素的格式,数据类型等。 
定义一个ElementType的基本格式为: 
<ElementType 
content="{empty | textOnly | eltOnly | mixed}"  
dt:type="datatype"  
model="{open | closed}"  
name="idref"  
order="{one | seq | many}" > 
</ElementType> 
content  
Content用于描述元素中的内容类型。  
empty  
元素内容为空  
textOnly  
元素只包含文本类型的内容  
eltOnly  
元素只包含元素类型的内容 
mixed  
元素内容包含上述任何情况 
<ElementType name="x" content="empty"/> 
<ElementType name="x" content="textOnly"/> 
<ElementType name="x" content="eltOnly"> 
<element type="y"> 
</ElementType> 
<ElementType name="x" content="mixed"> 
<element type='q'> 
<element type='r'> 
</ElementType> 
  
model  
Model定义元素的内容是否要严格的遵守schema中的定义。  
open  
元素内容可添加未特殊定义过的元素,特征,文本等  
closed  
元素内容只能添加特殊定义过的元素,特征,文本等  
<ElementType name="x" model="open"/> 
<ElementType name="y" model="close"/> 
  
name  
定义该元素的名称  
     
<ElementType name="x"></ElementType>  
order  
定义该元素子元素的排列顺序  
one  
只允许元素内容按一种方式排列  
seq  
允许元素内容按指定的方式排列  
many  
按任意方式排列  
<ElementType name='z' order="one"> 
<element type="x"> 
<element type="y"> 
</ElementType> 
<ElementType name="x" order="one"> 
<group order="seq"> 
<element type="x1"> 
<element type="y1"> 
</group> 
<group order="seq"> 
<element type="x2"> 
<element type="y2"> 
</group> 
</ElementType> 
<ElementType name="x" content="eltOnly" order="many"> 
<element type='q'> 
<element type='r'> 
</ElementType> 
特别注明,seq只元素内容可以按特殊列出的排列顺序中任选一种。 
Dt:type  
用于指定元素文本的数据类型  
boolean  
布尔型  
char  
字符型  
date  
日期型  
Date time  
日期时间型  
Float  
实型  
Int  
整型  
Number  
数字型  
Time  
时间型  
Uri  
Universal Resource Identifier,如"urn:schemas-microsoft-com:Office9"  
Uuid  
例如"333C7BC4-460F-11D0-BC04-0080C7055A83".  
entity 
xml补充类型  
entities  
xml补充类型  
enumeration  
xml补充类型  
id  
xml补充类型  
idref  
xml补充类型  
idrefs  
xml补充类型  
nmtoken  
xml补充类型  
nmtokens  
xml补充类型  
notation  
xml补充类型  
string  
字符串类型  
<ElementType dt:type=”int”></Element> 
上表中只列举了一部分常见数据类型,如果您想得到关于dt:type更详细的信息,请浏览MSDN。 
除此之外,元素类型可以有另外一种方式,即引用一个已有的ElementType,请看下例: 
<ElementType name="pages" content="textOnly" dt:type=”int” model="closed" /> 
<ElementType name="book" content="eltOnly" model="closed" order=”seq”> 
<element type="pages" />  
</ElementType> 
在元素book的定义中,为其定义了一个子元素,子元素的类型引用元素pages的定义。 
  
AttrributeType  
Attribute也是xml的元素之一,用它可以表示Element中的某些特征,自然,我们也希望对attribute的数据结构和数据类型作定义。 
定义AttributeType的基本格式为 
<AttributeType 
default="default-value"  
dt:type="primitive-type"  
dt:values="enumerated-values"  
name="idref"  
required="{yes | no}" > 
default  
设定attribute的默认值,必须注意的是,default的值也必须符合AttributeType中其他对数据结构的定义  
Dt:type  
用于指定Attribute的数据类型  
boolean  
布尔型  
char  
字符型  
date  
日期型  
Date time  
日期时间型  
Float  
实型  
Int  
整型  
Number  
数字型  
Time  
时间型  
Uri  
Universal Resource Identifier,如"urn:schemas-microsoft-com:Office9"  
Uuid  
例如"333C7BC4-460F-11D0-BC04-0080C7055A83".  
entity  
xml补充类型  
entities  
xml补充类型  
enumeration  
xml补充类型  
id  
xml补充类型  
idref  
xml补充类型  
idrefs  
xml补充类型  
nmtoken  
xml补充类型  
nmtokens  
xml补充类型  
notation  
xml补充类型  
string 
字符串类型  
<AttributeType dt:type=”int”> 
AttributeType的datatype类型与ElementType的datatype类型是相同的,上表中只列举了一部分常见数据类型,如果您想得到关于dt:type更详细的信息,请浏览MSDN。 
Dt:values  
当dt:type为enumeration型时,定义attribute的可能值列表,attribute的值将在这些值中选取  
<AttributeType name="colors" dt:type="enumeration" 
dt:values="red green blue"> 
  
name  
定义attribute的名称  
required  
定义该attribute是否一定要包含在element中  
yes  
一定要包含  
no  
不一定要包含  
AttributeType与ElementType一样,也可以引用已有的AttributeType定义: 
  
description  
description是一种注释,用于说明Schema的定义内容。 
<ElementType name="Book"> 
<description> 
This is how we describe the books we sell. Be sure to specify 
the ageGroup! 
</description> 
<element type="ageGroup"> 
<default>ADULT</default> 
</element> 
</ElementType> 
  
group Element  
group用来按一定序列,将element组织成group  
group的表达形式为 
<group 
maxOccurs="{1 | *}"  
minOccurs="{0 | 1}"  
order="{one | seq | many}" > 
maxOccurs  
定义该group出现的最多次数  
1  
只能调用一次  
*  
可以调用任意次  
minOccurs  
定义该group出现的最少次数  
0  
无要求  
1  
至少调用一次  
order  
定义该group中element的排列顺序  
one  
只允许元素内容按一种方式排列  
seq  
允许元素内容按指定的方式排列  
many  
按任意方式排列  
  
<ElementType name="x" order="one"> 
<group order="seq"> 
<element type="x1"> 
<element type="y1"> 
</group> 
<group order="seq"> 
<element type="x2"> 
<element type="y2"> 
</group> 
</ElementType> 
  
Extensibility  
Xml Schema时刻扩展的,他们建立在一个开放的内容模式上,在Schema文档上可以任意的添加elemtnt和attribute,如下例,你可以利用其extensibility机制,对element “page”加以限制条件,由namespace “myEXT”扩展的tag,限制了书本的页数必须在50至100页之间。 
<ElementType name="pages" xmlns:myExt="urn:myschema-extensions"> 
<datatype dt:type="int" /> 
<myExt:min>50</myExt:min> 
<myExt:max>100</myExt:max> 
</ElementType> 
  
如何在XML文件中引用XML Schema  
要在一个XML文件中引用一个Schema,只需在相应的element处注明,一般格式为: 
<”elementname” xmlns=” x-schema:[the url of the schema file]” > 
例如: 
<book xmlns="x-schema:http://www.microsoft.com/xml/schema/book.xml"> 
<title>Presenting XML</title> 
<author>Richard Light</author> 
<pages>334</pages> 
</book> 
  
Schema 与 DTDs  
在Schema之前,另有一种定义XML结构的方式,即DTDs,两者的区别在于: 
1 XML Schemas是XML文档,而DTDs有自己的特殊语法,这样,你只需懂得XML的语法规则即可编写Schema,无需学习其他语法规则;xml文件与xml schema文件可以用相同的语法分析器来解析,而无须写两套分析器;xml schema有强大、易用的扩展功能。 
2 XML Schema利用名域将文档中特殊的节点与schema说明相联系,一个xml文件可以有多个对应的schema,而用DTDs的话,一个xml文件只能由一个相对应的DTDs。 
3 XML schemas内容模型是开放的,可以随意扩充,而DTDs将无法解析扩充的内容。 
4 DTDs只能把内容类型定义为一个字符串。而XML schemas允许你把内容类型定义为整型、浮点型、数据型、布尔型或者许多其他的简单数据类型,而无须重定义。 
  
实例分析  
现在我们来分析一下第二节中所举的schema例子定义了什么: 
<?xml version="1.0"?> 
<Schema> 
<ElementType name="title" content="textOnly" model="closed" /> 
<ElementType name="author" content="textOnly" dt:type=”string” model="closed" /> 
<ElementType name="pages" content="textOnly" dt:type=”int” model="closed" /> 
<ElementType name="book" content="eltOnly" model="closed" order=”seq”> 
<element type="title" /> 
<element type="author" /> 
<element type="pages" />  
</ElementType> 
</Schema> 
该schema文件定义了四种element type: 
title:只能有文本内容 
author:只能有文本内容,数据类型为字符串型 
pages:只能有文本内容,数据类型为整型 
book:只能包含子元素,并且子元素的排列顺序必须按照schema所规定的顺序 
book元素包含分别用,title,author,pages所定义的三个子元素。