Saturday, September 27, 2008

创建自己的第一个XML Schema

XML Schema是用来定义和验证XML的规则文件,比如,你的XML中应该包含哪些元素,属性,元素的子元素是什么,他的类型是字符串还是数字,或者可能是日期或者一个唯一的ID。好了从上面这句话中我们就得到几个概念名字:元素:<xs:element>,用于定义你的XML中的元素。</xs:element>属性:<xs:attribute>,用于定义你的XML中的元素的属性。</xs:attribute>类型:元素或者属性的类型,比如:xs:string代表字符串,xs:int 代表一个整数,后面我们会有专门的一节来介绍这些属性。好了,下面开始我们的第一个XML Schema文件
我首先给出XML的源文件的样子
<?xml version="1.0"?>
<library>
<book id="test" available="true">
<isbn>
ISBN001
</isbn>
<title lang="en">
Being a dog is a Full-Time Job
</title>
<author id="CMS">
<name>
Tom Hances
</name>
<born>
1970-01-01
</born>
<death>
2002-01-01
</death>
</author>
<character id="test">
<name>
Slippry
</name>
<born>
2001-01-01
</born>
<qualification>
Tester
</qualification>
</character>
<character id="Urgly">
<name>
Urgly
</name>
<born>
1999-01-01
</born>
<qualification>
Developer
</qualification>
</character>
<character id="Johnson">
<name>
Johnson
</name>
<born>
1999-01-01
</born>
<qualification>
TeamLeader
</qualification>
</character>
</book>
</library>

好了,现在开始定义XSD:
1)所有点XML所有点XML Schema必须以<xs:schema xs="http://www.w3.org/2001/XMLSchema"></xs:schema>开头。
2)<xs:element>代表一个元素 比如book,book元素还有子元素我们一会儿将介绍一种complexType来定义他的元素类型。
其他诸如name,born,qualification 等只是一个简单的元素没有任何子元素也没有任何属性,我们先来定义这些属性。

<xs:element name="name" type="xs:string"></xs:element> <!--name 是一个简单的字符串-->
<xs:element name="qualification" type="xs:string"></xs:element>
<xs:element name="born" type="xs:date"></xs:element><!--born 是一个时期类型的,他的默认格式为yyyy-MM-dd-->
<xs:element name="death" type="xs:date"></xs:element>
<xs:element name="isbn" type="xs:string"></xs:element>
<xs:attribute name="id" type="xs:ID"></xs:attribute><!--这个xs:ID 属性表明他是一个唯一的值-->
<xs:attribute name="available" type="xs:boolean"></xs:attribute><!--xs:boolean布尔值-->
<xs:attribute name="lang" type="xs:language"></xs:attribute><!--还有一个专门的language类型,他的取值范围必须是国际化标准值,比如en,de等等-->

3)好了,所有的简单元素都已经定义好了。
我们来看另外一个元素,title
<title lang="en">
Being a dog is a Full-Time Job
</title>

他只有一个简单的文本内容,有一个属性lang,,没有子元素。这种元素该如何定义呢。XSD 中complexType可以帮助我们,他用于定义XSD标准中没有提供的复杂类型。
想title这样的元素我们可以定义为下:
<xs:element name="title">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute ref="lang">
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
以上的内容中有两个新的关键字,complexType 我们刚才已经讲过了。还有一个simpleContent 他就是用来定义像title这样的只包含文本和属性的简单元素。其中ref="lang"
代表这个属性引用了我们已经定义的lang熟悉。xs:extension base="xs:string" 代表这个元素的类型继承自字符串类型。
4)现在是最复杂的部分,我直接给出例子,下面是Book元素的描述
<xs:element name="book">
<xs:complexType> <!--定义一个复杂的类型-->
<xs:sequence><!--元素内的子元素是顺序出现的-->
<xs:element ref="isbn"/><!--引用一个已经存在的元素-->
<xs:element ref="title"/>
<xs:element ref="author" minOccurs="0" maxOccurs="unbounded"/><!--minOccurs最少出现0次,maxOccurs="unbounded" 最大出现的次数没有限制-->
<xs:element ref="character" minOccurs="0" maxOccurs="unbounded"/><!--如果不定义minOccurs或者maxOccurs默认情况下之出现一次-->
</xs:sequence>
<xs:attribute ref="id"/><!--负责元素的属性定义必须放在sequence 之外,而且必须在他的下面-->
<xs:attribute ref="available"/>
</xs:complexType>
</xs:element>

No comments: