Schema语法
任何语言都有一定的语法,Schema也不例外。了解了Schema的基本用法,接下来,本节将针对Schema语法进行详细地讲解。
一、元素定义
Schema和DTD一样,都可以定义XML文档中的元素。在Schema文档中,元素定义的语法格式如下所示:
<xs:element name="xxx" type="yyy"/>
在上面的语法格式中,element用于声明一个元素,xxx指的是元素的名称,yyy 指元素的数据类型。在XML Schema 中有很多内建的数据类型,其中最常用的有以下几种:
● xs:string:表示字符串类型
● xs:decimal:表示小数类型
● xs:integer:表示整数类型
● xs:boolean:表示布尔类型
● xs:date:表示日期类型
● xs:time:表示时间类型
了解了元素的定义方式,接下来看一个XML的示例代码,具体示例如下:
<lastname>Smith</lastname>
<age>28</age>
<dateborn>1980-03-27</dateborn>
在上面的XML示例代码中,定义了三个元素,这三个元素对应的Schema定义如下所示:
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>
二、属性的定义
在Schema文档中,属性定义的语法格式如下所示:
<xs:attribute name="xxx" type="yyy"/>
在上面的语法格式中,xxx 指的是属性名称,yyy 指的是属性的数据类型。其中,属性的常用数据类型与元素相同,都使用的是XML Schema中内建的数据类型。
了解了属性的定义方式,接下来,看一个XML的简单例子,具体示例如下所示:
<lastname lang="EN">Smith</lastname>
在上面的这段简易XML例子中,属性的名称是lang,属性值的类型是字符串类型,因此,对应的Schema定义方式如下所示:
<xs:attribute name="lang" type="xs:string"/>
一、简单类型
在XML Schema文档中,只包含字符数据的元素都是简单类型的。简单类型使用 xs:simpleType元素来定义。如果想对现有元素内容的类型进行限制,则需要使用xs:restriction元素。接下来,通过以下几种情况详细介绍如何对简单类型元素的内容进行限定,具体如下:
(1)xs:minInclusive和xs:maxInclusive元素对值的限定
例如,当我们定义一个雇员的年龄时,雇员的年龄要求是18~58周岁之间,这时,需要对年龄“age”这个元素进行限定,具体示例代码如下所示:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="18"/>
<xs:maxInclusive value="58"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
在上面的示例代码中,元素age的属性是integer,通过xs:minInclusive和xs:maxInclusive元素限制了年龄值的范围。
(2)xs:enumeration元素对一组值的限定
如果希望将 XML 元素的内容限制为一组可接受的值,可以使用枚举约束(enumeration constraint),例如,要限定一个元素名为Car的元素,可接受的值只有:Audi、Golf、BMW,具体示例如下:
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
(3)xs:pattern元素对一系列值的限定
如果希望把 XML 元素的内容限制定义为一系列可使用的数字或字母,可以使用模式约束(pattern constraint)。例如,要定义一个带有限定的元素“letter”,要求可接受的值只能是字母a-z其中一个,具体示例如下:
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
(4)xs:restriction元素对空白字符的限定
在XML文档中,空白字符比较特殊,如果需要对空白字符(whitespace characters)进行处理,可以使用 whiteSpace元素。whiteSpace元素有三个属性值可以设定,分别是preserve、replace和collapse。其中,preserve表示不对元素中的任何空白字符进行处理,replace表示移除所有的空白字符,collapse表示将所有的空白字符缩减为一个单一字符。接下来,以preserve为例,学习如何对空白字符进行限定,具体示例如下:
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
在上面的示例代码中,对address元素内容的空白字符进行了限定。在使用whiteSpace限定时,将值设置为“preserve”,表示这个XML处理器将不会处理该元素内容中的所有空白字符。
需要注意的是,在Schema文档中,还有很多限定的情况,比如对长度的限定,对数据类型的限定等等,如果读者想更多的了解这些限定的使用,可以参看w3c文档。
一、复杂类型
除简单类型之外的其它类型都是复杂类型,在定义复杂类型时,需要使用xs:complexContent元素来定义。复杂类型的元素可以包含子元素和属性,这样的元素称为复合元素。在定义复合元素时,如果元素的开始标记和结束标记之间只包含字符数据内容,那么这样的内容是简易内容,需要使用xs:simpleContent元素来定义。反之,元素的内容都是复杂内容,需要使用xs:complexContent元素来定义。复合元素有四种基本类型,接下来,针对这四种基本类型分别进行讲解。具体如下:
(1) 空元素
这里的空元素指的不包含内容,只包含属性的元素,具体示例如下:
<product prodid="1345" />
在上面的元素定义中,没有定义元素product的内容,这时,空元素在XML Schema文档中对应的定义方式如下所示:
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
(2) 包含其它元素的元素
对于XML文档中包含其它元素的元素,例如下面的示例代码:
<person>
<firstname>John</firstname>
<lastname>Smith</lastname>
</person>
在上面的示例代码中,元素person嵌套了两个元素,分别是firstname和lastname。这时,在Schema文档中对应的定义方式如下所示:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
(3) 仅包含文本的元素
对于仅含文本的复合元素,需要使用simpleContent元素来添加内容。在使用简易内容时,必须在simpleContent元素内定义扩展或限定,这时,需要使用extension或restriction元素来扩展或限制元素的基本简易类型。请看一个XML的简易例子,其中,“shoesize”仅包含文本,具体示例如下:
<shoesize country="france">35</shoesize>
在上面的例子中,元素shoesize包含了属性以及元素内容,针对这种仅包含文本的元素,需要使用extension来对元素的类型进行扩展,在Scheam文档中对应的定义方式如下所示:
<xs:element name="shoesize">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="country" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
(4) 包含元素和文本的元素
在XML文档中,某些元素经常需要包含文本以及其它元素,例如,下面的这段XML文档:
<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid>
will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>
上面的这段XML文档,在Schema文档中对应的定义方式如下所示:
xs:element name="letter">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="orderid" type="xs:positiveInteger"/>
<xs:element name="shipdate" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
需要注意的是,为了使字符数据可以出现在letter元素的子元素之间,使用了mixed属性,该属性是用来规定是否允许字符数据出现在复杂类型的子元素之间,默认情况下mixed的值为false。