XML Schema帮你建模(3)

2016-02-19 14:50 0 1 收藏

下面是个超简单的XML Schema帮你建模(3)教程,图老师小编精心挑选推荐,大家行行好,多给几个赞吧,小编吐血跪求~

【 tulaoshi.com - Web开发 】

命名冲突


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

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  代码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

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  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

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

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

来源:https://www.tulaoshi.com/n/20160219/1608095.html

延伸阅读
标签: Web开发
新的 XML Schema 系统即将成为 W3C 推荐标准,目的是为了克服 DTD 的局限性(请参阅侧栏, DTD 的局限性 ),为 XML 文档提供丰富的语法结构。本文展示了模式的灵活性,说明如何使用 XML Schema 系统来定义最基本的 XML 文档构造块元素。 XML Schema 比 DTD 更强大。为了说明 XML Schema 机制的强大功能,下面三个程序清单简要比较了表...
标签: Web开发
我们可以看到,DTD的语法相当复杂,并且它不符合XML文件的标准,自成一个体系。也就是说DTD文档本身并不是一个良好形式的XML文档,上面的关于DTD的介绍也仅仅是作了一个简介,目的是帮助大家能读懂DTD文件以及在必要时创建简单的DTD文件,因为现在很多的XML应用是建立在DTD之上的。   另外一个代替DTD的就是W3...
对于名称空间,理解了OO思想的人应该是比较简单的了,特别是对学过C++的人来说更是 如此;但很多看了我前面文章的朋友,在和我的交流中,好像对名称空间都不怎么清楚, 下面我们就来说说怎么样在 XML Schema和WSDL中使用名称空间. 先看看一段JAVA代码: package com.hongsoft.test.pkg1; import com.hongsoft.test.pkg2.Test1; import com.hongsof...
标签: Web开发
Preface:本文是W3CSchools上《Schema指南》的学习笔记。其中大部分内容是对指南的翻译总结。由于原文的例子更详尽生动,如果各位想阅读原文可以到这个网址http://www.w3schools.com/schema/default.asp。 同时,W3CSchools提供了测试,大家可以测试一下自己的理解程度。 首先简单的说一下,Schema中的简单类型(SimpleType)有三种:SimpleE...
标签: Web开发
6.标识之间不可以交叉 学生 编号001 姓名张三 如果写成了 学生 编号001 姓名 张三 是万万不可以的。 以上六点,对于写惯了HTML的人来说,要多多注意呀,千万别按照已有的习惯来写XML,不然就时时会出错。

经验教程

770

收藏

28
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部