分享
 
 
 

XMLSchema帮你建模(3)

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

命名冲突

我们现在已经讨论了如何定义新的复合类型(比如PurchaseOrderType)、声明元素(比如purchaseOrder)和声明属性(如orderDate)。在这些定义行为中,一般都包含着命名,如果我们给两个对象赋予同样的名称会有何种结果? 答案取决于问题中的两个对象,一般来说这两个对象越相近,它们越有可能引起冲突。

下面,我们给出一些例子来说明什么时候同样的名称会导致问题。如果两个对象都是类型,而且定义了一个复合类型为USStates,同时又定义了一个简单类型为USStates,此时就出现了冲突。如果两个对象是类型和元素或者是类型和属性,当定义了一个复合类型叫USAddress时,同时又定义了一个元素称为USAddress,此时是没有冲突发生的。如果两个对象是不同类型的元素(一般地、并非是全局元素),当我们声明了一个元素名字作为 USAddress类型的一部分,并且第二个元素名字作为item类型的一部分,此时就没有冲突(类似的元素有时候称为局部元素声明)。最后,如果两个对象都是类型,你自己定义了其中的一个,而XML Schema规范内置定义了另外的一个,比如定义了一个简单类型称为decimal,那么此时没有冲突发生。这里之所以没有命名冲突发生的,因为它们属于不同的命名空间。

使用简单类型

在购买订单模式文档po.xsd中,有几个元素和属性被声明为简单类型。其中一些简单类型如 string 和decimal是XML Schema中内置的,其它的一些则是源于(如果使用对象技术的语言就是继承)内置的类型。举例来说,partNum属性的类型称为SKU(Stock Keeping Unit),它是源于string的。内置的简单类型和它们的后继版本都能够用在所有的元素和属性声明中。

新的简单类型通过从现有的简单类型(内置的简单类型以及源于内置简单类型的简单类型)引出定义。通常,我们通过重新约束一个现存的简单类型来引出一个新的简单类型。换句话说,新类型的合法值范围是现有类型的值范围的子集。我们使用simpleType元素来定义和命名新的简单类型,使用 restriction元素来指出现有的基类型,并且用它来标识约束值范围的细节。

假设希望建立一个新的整数类型称为myInteger,它的值范围为10000到99999。那么定义应当基于简单类型integer,然后定义它的值范围为10000到99999。为了定义myInteger,这样来约束integer的范围,参见代码6:

<!--代码 6 使用基类型来定义新的简单类型-->

<xsd:simpleType name="myInteger">

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

<xsd:minInclusive value="10000"/>

<xsd:maxInclusive value="99999"/>

</xsd:restriction>

</xsd:simpleType>

代码6的例子显示了由一个基本类型定义和两个值域区间方面描述的组合,通过这三个要素对myInteger实施定义。

先前的购买订单模式文档包含了其它更详细的定义简单类型的例子。一个叫SKU的新简单类型(参见代码7)是从(通过约束)简单类型 string引出的。此外,我们使用一个称为pattern的描述,以及pattern的正则表达式值“\d{3}-[A-Z]{2}”来约束SKU的值。其中,该正则表达式值的语义为3个数字后面跟着一个连字号,接着跟着两个大写的英文字母。

<!--代码7 SKU简单类型定义-->

<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(参见代码8),USState是从string类型引出的,同时它的值必须为美国州名的缩写。

<!--代码8 USState简单类型定义-->

<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等中。注意对于特定类型的列举值必须是惟一的。

匿名类型定义

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

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

<!--代码 0-9 po.xsd模式定义-->

<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。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有