XML Schema帮你建模(1)

原创 2004年11月03日 16:55:00
XML Schema是2001年5月正式发布的W3C(万维网联盟)的推荐标准,经过数年的大规模讨论和开发如今终于奠定下来,成为全球公认的XML环境下首选的数据建模工具。
  
  由于XML是SGML(标准通用标示语言)的一个子集,它也继承了SGML用于建模的DTD。使用DTD的好处是可以利用大量现有的DTD工具,使得开发应用代价维持在一个相对较低的水平。然而,DTD有不少缺陷:
  
  1. DTD是基于正则表达式的,描述能力有限;
  
  2. DTD没有数据类型的支持,在大多数应用环境下能力不足;
  
  3. DTD的约束定义能力不足,无法对XML实例文档做出更细致的语义限制;
  
  4. DTD不够结构化,重用的代价相对较高;
  
  5. DTD并非使用XML作为描述手段,而DTD的构建和访问并没有标准的编程接口,无法使用标准的编程方式进行DTD维护。
  
  XML Schema正是针对这些DTD的缺点而设计的,它完全使用XML作为描述手段,具有很强的描述能力、扩展能力和处理维护能力。
  
  
  XML Schema简介
  
  
  XML Schema的主要目的是用来定义一类XML文档(一个XML Application)。因此,模式的“实例文档”形式常常被用于描述一个与特定XML Schema相一致的XML文档。事实上,文档实例和Schema文档都不是必须要以文档的形式存在,它们可以以在应用之间传递的字节流的形式存在,或者作为一个数据库记录及XML的“信息项”的集合存在。然而为了简化入门,我们总是把实例和模式看作文档或者文件,认为它们总以文档实例或是模式文档的形式存在。
  
  这里我们将结合一个实例来对XML Schema进行简单的概述,希望大家通过阅读本节的内容初步掌握的使用方法和XML Schema文档实例的具体语义。XML Schema是Web Services技术中需要使用的一个基本工具,然而并不是XML Schema的所有特性都会被广泛地使用,因此,本文将不对XML Schema规范做系统的介绍。
  
  在介绍XML Schema语法之前,先来考虑一个XML实例文档po.xml。它描述了一个由家庭产品采购/支付应用生成的家庭产品购买订单(参阅代码1)。
  
  <!--代码 1 po.xml,购买订单的XML实例文档-->
  <?xml version="1.0"?>
  <purchaseOrder orderDate="1999-10-20">
  <shipTo country="US">
  <name>Alice Smith</name>
  <street>123 Maple Street</street>
  <city>Mill Valley</city>
  <state>CA</state>
  <zip>90952</zip>
  </shipTo>
  <billTo country="US">
  <name>Robert Smith</name>
  <street>8 Oak Avenue</street>
  <city>Old Town</city>
  <state>PA</state>
  <zip>95819</zip>
  </billTo>
  <comment>Hurry, my lawn is going wild!</comment>
  <items>
  <item partNum="872-AA">
  <productName>Lawnmower</productName>
  <quantity>1</quantity>
  <USPrice>148.95</USPrice>
  <comment>Confirm this is electric</comment>
  </item>
  <item partNum="926-AA">
  <productName>Baby Monitor</productName>
  <quantity>1</quantity>
  <USPrice>39.98</USPrice>
  <shipDate>1999-05-21</shipDate>
  </item>
  </items>
  </purchaseOrder>
  
  
  
  这个购买订单由一个跟元素purchaseOrder及其子元素shipTo、billTo、comment和items组成。这些子元素(除了comment)也依次包含了其它的一些子元素。
  
  叶子元素包含的是一个数字而不是任何子元素,如USPrice这样的子元素。元素如果包含子元素或者是带有属性的,被称为复合类型;反之元素如果仅仅包含数字、字符串或者其它数据等,但不包含任何子元素的,则被称为简单类型。在这个实例文档中,复合类型和一些简单类型是在购买定单的模式文档中定义的,而其它一些标准的简单类型则是作为XML Schema内置的简单类型的形式出现的。
  
  在研究这个实例文档的购买订单模式文档之前,先介绍一下购买订单实例文档和模式文档之间的联系。一个实例文档实际上并不一定需要引用模式文档,当然,在事实上的使用中,很多实例文档确实引用了模式文档,为了使入门变得更加简单,一开始我们选择不引用。同时假设任何实例文档的处理器即使从购买订单实例文档中得不到任何信息,也能够正确地进行购买订单模式文档的处理。
  
  
  购买订单模式文档
  
  
  在代码2,给出了购买订单的模式文档。文件po.xsd在给出解释之前,大家可以使用XML的知识去尝试理解这个模式文档。
  
  <!--代码 2 po.xsd,购买订单的Schema文档-->
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:annotation>
  <xsd:documentation xml:lang="en">
  Purchase order schema for Example.com.
  Copyright 2000 Example.com. All rights reserved.
  </xsd:documentation>
  </xsd:annotation>
  <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
  <xsd:element name="comment" type="xsd:string"/>
  <xsd:complexType name="PurchaseOrderType">
  <xsd:sequence>
  <xsd:element name="shipTo" type="USAddress"/>
  <xsd:element name="billTo" type="USAddress"/>
  <xsd:element ref="comment" minOccurs="0"/>
  <xsd:element name="items" type="Items"/>
  </xsd:sequence>
  <xsd:attribute name="orderDate" type="xsd:date"/>
  </xsd:complexType>
  <xsd:complexType name="USAddress">
  <xsd:sequence>
  <xsd:element name="name" type="xsd:string"/>
  <xsd:element name="street" type="xsd:string"/>
  <xsd:element name="city" type="xsd:string"/>
  <xsd:element name="state" type="xsd:string"/>
  <xsd:element name="zip" type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="country" type="xsd:NMTOKEN"
  fixed="US"/>
  </xsd:complexType>
  <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>
  <!-- Stock Keeping Unit, a code for identifying products -->
  <xsd:simpleType name="SKU">
  <xsd:restriction base="xsd:string">
  <xsd:pattern value="/d{3}-[A-Z]{2}"/>
  </xsd:restriction>
  </xsd:simpleType>
  </xsd:schema>
  
  
  
  购买订单模式文档由一个schema元素和一系列子元素组成,大多数子元素为element、complexType和simpleType,这些决定了实例文档中元素的表现方式和内容,大家最好能熟记element、complexType、simpleType这几个元素,这些将是我们一直需要使用的几个元素。
  
  同时,可以通过使用出现在schema元素中的命名空间声明xmlns:xsd="http://www.w3.org/2001/XMLSchema",使得模式文档中的每一个元素都有一个与XML Schema命名空间相联系的命名空间前缀“xsd:”。尽管在语法上,可以使用任意的前缀形式,但是,命名空间前缀“xsd:”被约定用于表示XML Schema命名空间。由于使用同样的前缀,所以同样的关联就会出现在内置的简单类型的名字中,例如xsd:string。这种形式关联的目的是用来表示当前的元素或简单类型是属于XML Schema语言的内置定义的,而不是属于模式文档作者自己的词汇表的。为了在这里清楚并且简单地表示,我们仅提及元素的名字和简单类型名,而忽略它们的前缀“xsd:”。 
   
  

XML Schema帮你建模

XML Schema帮你建模     XML Schema是2001年5月正式发布的W3C(万维网联盟)的推荐标准,经过数年的大规模讨论和开发如今终于奠定下来,成为全球公认的XML环境下首选的数据建模...
  • Tisten
  • Tisten
  • 2005年03月02日 23:56
  • 895

XML Schema帮你建模(一)

XML Schema帮你建模(1)作者: 柴晓路   www.ASPCool.com      XML Schema是2001年5月正式发布的W3C(万维网联盟)的推荐标准,经过数年的大规模讨论和开发...
  • outiejun
  • outiejun
  • 2004年11月30日 17:34
  • 332

XML Schema帮你建模(三)

XML Schema帮你建模(3)作者: 柴晓路   www.ASPCool.com      命名冲突         我们现在已经讨论了如何定义新的复合类型(比如PurchaseOrderType...
  • outiejun
  • outiejun
  • 2004年11月30日 17:58
  • 365

XML Schema帮你建模(3)

我们现在已经讨论了如何定义新的复合类型(比如PurchaseOrderType)、声明元素(比如purchaseOrder)和声明属性(如orderDate)。在这些定义行为中,一般都包含着命名,如果...
  • naive1010
  • naive1010
  • 2004年11月03日 17:06
  • 778

XML Schema帮你建模(4)

除了使用简单类型中描述的原子类型(这些原子类型可用于组合成绝大多数的其它类型,包括其它的简单类型和复合类型)外,XML Schema中在简单类型范畴中还有列表类型(List Type)的概念。原子类型...
  • naive1010
  • naive1010
  • 2004年11月03日 17:12
  • 694

XML Schema帮你建模(二)

XML Schema帮你建模(2)作者: 柴晓路   www.ASPCool.com      复合类型定义、元素和属性声明      在XML Schema中,对于那些允许元素有自己的内容,以及可以...
  • outiejun
  • outiejun
  • 2004年11月30日 17:39
  • 342

XML Schema帮你建模(2)

复合类型定义、元素和属性声明      在XML Schema中,对于那些允许元素有自己的内容,以及可以携带自身属性的复合类型与那些不能够有元素内容和属性的简单类型,它们的表示形式有着本质的不同。在实...
  • naive1010
  • naive1010
  • 2004年11月03日 17:02
  • 1118

关于一个xml schema校验问题的解决办法

今年的一个项目用到了xml的schema校验。但是在使用的过程中遇到了一个问题: schema在控制字符串长度的时候用的是字符个数,比如 "abc"  和 “我爱你” 的长度都是3。但是按照字节来算。...
  • shuishouhcd
  • shuishouhcd
  • 2014年01月13日 18:11
  • 1293

使用schema校验xml

一、背景  在大型的项目开发中,我们往往要是用xml进行一些规范化的处理。这时候就需要有高手先做好上层的一些规则。这时候往往就会用到schema对xml进行一个规范化的校验  二、代码实践  ...
  • gxsenjoy
  • gxsenjoy
  • 2016年12月02日 14:53
  • 672

XML Schema基本用法

Schema与DTD一样,都是对xml文件的规范和约束,但是Schema比DTD更加细粒度、数据类型更多、功能更加强大,所以现在大多数都选择Schema。Schema也是一个XML文件,因此编写Sch...
  • u013516966
  • u013516966
  • 2015年01月26日 13:37
  • 1707
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XML Schema帮你建模(1)
举报原因:
原因补充:

(最多只允许输入30个字)