站长中国
设为首页 | 站长论坛

站长论坛 站长下载
您所在的位置: 站长中国 > 站长学院 > 网络编程 > XML专区 > 正文

XML Schema帮你建模(3)
  2007年09月14日23:27:20  评论(1条) 字体:[ ]
相关热点: 类型 定义 简单 元素 两个 name 代码 声明
命名冲突


  我们现在已经讨论了如何定义新的复合类型(比如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。


责任编辑:

收藏本文 打印 打印本文  推荐本文 告诉好友 投稿 投稿邮箱

站长排行

学院

新闻

专栏

盈利

[揭密网络黄链]中国留学生买凶专破日本
JSP语法(6)
超强弹出窗口代码,什么都挡不住
FLASH视觉特效实例之地震效果
贴吧发帖机使用教程(绝对原创)
关于数据分页(转自www.codeproject.co
ASP实现文件直接下载
Photoshop制作光感超酷效果水晶球
 遍历ASP.NET页面控件
永远的后门[经典]+查不出的后门
淘宝网卖家公然叫卖“艳照门”照片集
驳《百度Hi面世对腾讯有利》
Google绿色专家质疑黑色背景网页节省资
国内各IT企业办公环境揭秘(多图)
阿里妈妈广告卖主全攻略
站长创业源动力 主流站长站赏析
推荐阅读:80年小子的创业道理
Discuz!6.0猛将出击 最强论坛程序酷炫
我的网络,我的团队:专访李文明
百度新闻频道改版十天 流量止跌反弹翻
ECSHOP模板制作参考文档
悬挂阿里妈妈会否被百度惩罚
阿里妈妈是否是中小站长的救世主?
最强网店ECShop发新版 众多酷炫功能给
ECSHOP模板下载
土豆网,优酷网,爆米花等视频网站采集
DedeCms模板安装/制作概述
网上商店系统巅峰对决 ECShop vs ShopE
艰难的走在创业的路上 第一天
编程中国全站采集规则
性福联盟 一个不尊重站长的联盟
大脚:日赚100元—揭露最新firefox欺骗
大脚:垃圾站超级赚钱法之二—突破“站
大脚:垃圾站超级赚钱法之——前言
迅雷联盟、快车联盟收入对比
经理人必看的十个管理网站
Google Adsense的秘密 第二版
西联汇款兑付城市查询
不用SEO取得成功的10个步骤
关于做GOOGLE的五条经验
站长学院  网页设计 建站教程 图形图象 网络编程

Photoshop CS3
Photoshop CS3
不用Photoshop
不用Photoshop

DIV+CSS的开发方式 听听另外的
虚拟主机建站动易里快速生成的
VBScript特效代码 满屏幕乱跑
牛气!一个菜鸟站长的超强网站
创建、维护一个个人博客的“投
让网站流量稳步飙升的秘籍
网站推广的基本思想

新闻线索

如果你有站长界人事变动、重组并购、变革技术出现,以及产品投诉等重要新闻线索,请告诉我们,我们会给予特别关注。
0631-3653338
站长中国编辑部
站长中国24小时新闻热线: 13256307008