理解XML Schema: XML Schema初步 (四)

七列表类型(List Type)

除了在前面描述简单类型的那个表格中列出的原子类型(这些原子类型可用于组合成绝大多数的其他类型,包括其他的简单类型和复合类型)外,XML Schema中在简单类型范畴中还有列表类型的概念。(原子类型、列表类型以及将在下一节中描述的组合类型,总称为简单类型)。一个原子类型的值在XML Schema中是不可分割的。举例来说,NMTOKEN值US是不可分割的,US的任何部分,如字母S本身都是没有意义的。与之相比较,列表类型则是由一组原子类型组成,因此它的每一个部分(原子)本身都是有意义的。举例来说NMTOKENS是个列表类型。这个类型的元素将是NMTOKEN的列表,不同的NMTOKEN值间使用空格分隔,如"US UK FR"。XML Schema有三个内置的列表类型,他们是NMTOKENS、IDREFS和ENTITIES。

除了使用内置的列表类型之外,你还可以通过引用现有的原子类型来建立新的列表类型(你不可以使用现有的列表类型来建立新的列表类型。也不能使用复合类型来建立新的列表类型)。举例来说,我们可以建立一个名为myInteger的列表类型,并在实例文档中使用它(参见下图)。其中下图中的后半部分即为实例文档中与列表类型listOfMyIntType相一致的实例元素。


<!-- Schema Fragment -->
<xsd:simpleType name="listOfMyIntType">
  <xsd:list itemType="myInteger"/>
</xsd:simpleType>

<!-- Instance Fragment -->
<listOfMyInt>20003 15037 95977 95945</listOfMyInt>
 


一些用于描述的参数能够被应用到列表类型的定义中,它们是:length、minLength、maxLength和enumeration。举例来说,如果我们想定义一个列表,这个列表正好包含了六个美国的州名(SixUSStates)。我们首先从USState定义了一个新的列表类型,称为USStateList,然后我们通过限制USStateList 只有六个项来导出SixUSStates。具体的定义可参见下图。


<!-- Schema Fragment -->
<xsd:simpleType name="USStateList">
 <xsd:list itemType="USState"/>
</xsd:simpleType>

<xsd:simpleType name="SixUSStates">
 <xsd:restriction base="USStateList">
  <xsd:length value="6"/>
 </xsd:restriction>
</xsd:simpleType>

<!-- Instance Fragment -->
<sixStates>PA NY CA NY LA AK</sixStates>
 


类型为SixUSStates的元素必须有六个项,他们中的每一个必须是一个枚举类型USState的原子类型,在上图后半部分的实例文档中就是一个具体的应用例子。

此时,我们需要注意的是,我们可以从原子类型string导出一个列表类型,然而,在一个string中也许会带有空格,而空格在一个列表类型实例中是作为分隔符使用的。所以当在使用基类型为string的列表类型时,应当格外小心。举例来说,假设我们定义了一个length取值为3的列表类型,同时这个列表类型是基于类型string。以下的由三个元素组成的列表是合法的:"Asie Europe Afrique",而下面的由三个元素组成的列表则是不合法的:"Asie Europe Amérique Latine"。

即使"Amérique Latine"在列表外可以作为单独的一个字符串存在,但当它包含在列表中,在Amérique和Latine之间的空格使得第四个项被有效地生成了,因此后面的那个例子不符合只有三个项的列表类型定义。

 

八联合类型(Union Type)

应用原子类型和列表类型,一个元素或者属性的值可以为一个或者多个原子类型(列表类型)的实例。与之相比较,如果应用联合类型,一个联合类型包含了多个原子类型或者列表类型,而应用了联合类型的元素或是属性的值可以是这些原子类型或列表类型中的一个类型的实例。为了显示这点,我们建立一个用于表示美国的州的,为两个字母缩写或者数字列表的联合类型。zipUnion联合类型由一个原子类型和一个列表类型构成的(参见下图)。


<!-- Schema Fragment -->
<xsd:simpleType name="zipUnion">
  <xsd:union memberTypes="USState listOfMyIntType"/>
</xsd:simpleType>

<!-- Instance Fragment -->
<zips>CA</zips>
<zips>95630 95977 95945</zips>
<zips>AK</zips>
 


当我们在定义一个联合类型时,元素union的memberTypes属性的值包含了联合类型中所有类型的列表。现在,假定我们声明了一个zipUnion类型的元素,称为zips,zips元素有效的实例可参见上图。

此外,对于联合类型而言,还有两个描述性质的参数pattern和enumeration也可以应需要使用。

Copyrightc 2001 W3C,( MIT, INRIA, Keio),All Rights Reserved.

 

 

 

九匿名类型定义

 

 

使用XML Schema,我们能够通过定义一系列具有名称的类型,如PurchaseOrderType类型,然后声明一个元素,比如purchaseOrder,通过使用"type="这样的构造方法来应用类型。这种类型的模式构造非常直截了当,但有些不实用。特别是,如果你定义了许多只应用一次而且包含非常少约束的类型,在这些情况下,一个类型应该能够被更简单的定义。这样的简单定义通常的形式是一个节省了名称和外部引用开销的匿名类型。

 

在po.xsd(参见下图)中类型Items的定义中,有两个元素声明使用了匿名类型定义,它们是item和quantity。一般的来说,你能够通过元素中是否包含"type="这个属性来判断匿名元素定义(或者是匿名属性定义),而另方面,如果出现无名称的类型定义也可以认为是匿名元素(属性)定义。

 

<xsd:complexType name="Items">

 <xsd:sequence>

  <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">

   <xsd:complexType>

    <xsd:sequence>

     <xsd:element name="productName" type="xsd:string"/>

     <xsd:element name="quantity">

      <xsd:simpleType>

       <xsd:restriction base="xsd:positiveInteger">

        <xsd:maxExclusive value="100"/>

       </xsd:restriction>

      </xsd:simpleType>

     </xsd:element>

     <xsd:element name="USPrice"  type="xsd:decimal"/>

     <xsd:element ref="comment"   minOccurs="0"/>

     <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>

    </xsd:sequence>

    <xsd:attribute name="partNum" type="SKU" use="required"/>

   </xsd:complexType>

  </xsd:element>

 </xsd:sequence>

</xsd:complexType>

 

 

 

在item元素中,它被定义为一个复合匿名类型,该复杂类型是由productName、quantity、USPrice、comment、shipDate元素和一个称为partNum的属性组成的。在quantity元素中,他有一个简单匿名类型,从integer类型中引出,他的值范围为1到99。

 

 

十元素内容

 

 

购买订单的模式文档中包含了很多元素类型定义的例子:有元素包含其他元素的(如items),有元素包含其他元素和属性的(如shipTo)以及元素包含一个简单类型值的(如USPrice)。然而,我们没有看见包含了属性并且只包含一个简单类型值的元素,也没有看见包含了其他元素,同时也有文本内容,两者混在一起的元素,也没有看见更本不包含内容的元素。在本节,我们将要看看元素的内容模型的这些变化。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值