学科分类
目录
Java Web

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。

点击此处
隐藏目录