扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年9月22日
关键字:
在本页阅读全文(共7页)
上面的例子显示了一个由一个基本类型定义和两个值域区间方面描述的组合,通过这三个要素来对myInteger实施了定义。
而先前的购买订单模式文档则包含了其他的更详细的定义简单类型的例子。一个叫SKU的新简单类型(参见下图)是从(通过约束)简单类型string引出的。此外,我们使用一个称为pattern的描述以及pattern的正则表达式值"\d{3}-[A-Z]{2}"来约束SKU的值。其中,该正则表达式值的语义为:3个数字后面跟着一个连字号接着跟着两个大写的英文字母"。
<xsd:simpleType name="SKU">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-[A-Z]{2}"/>
</xsd:restriction>
</xsd:simpleType>
XML Schema定义了15用于简单类型定义描述的词汇。在这些词汇中,enumeration是特别有用的,他能够被用于约束除boolean类型之外的几乎每一个简单类型。enumeration限制简单类型的值为一系列不同的枚举值。举例来说,我们可以使用enumeration来定义一个新类型称为USState(参见下图),USState是从string引出的,同时它的值必须为美国州的缩写。
<xsd:simpleType name="USState">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="AK"/>
<xsd:enumeration value="AL"/>
<xsd:enumeration value="AR"/>
<!-- and so on ... -->
</xsd:restriction>
</xsd:simpleType>
USState将会在现在使用的state元素声明中成为string类型的一个非常好的替换品。通过使用这个替换品可以使state元素具有合法值的校验能力。举例来说,billTo和shipTo元素的子元素state,将会被限制在AK,AL,AR等等中。注意到对于特定类型的列举值必须是唯一的。
列表类型(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也可以应需要使用。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者