数码冲印数码照片网上冲印
站内搜索: 分类: 关键字:
您的位置:首页网站设计.Net专栏 → xml-了解 XML 架构
xml-了解 XML 架构
日期:2005-10-30 23:17:15 人气:     [ ]
数码冲印 网上冲印

了解 XML 架构

发布日期: 4/13/2004 | 更新日期: 4/13/2004

Aaron Skonnard

DevelopMentor

2003 年 3 月

适用于:

类型系统

XML 架构定义语言 (XSD)

Web 服务开发

*
本页内容

				简介
			简介

				数据类型:值和词法空间
			数据类型:值和词法空间

				在命名空间中定义类型
			在命名空间中定义类型

				定义简单类型
			定义简单类型

				定义复杂类型
			定义复杂类型

				定位和管理架构
			定位和管理架构

				小结
			小结

				参考
			参考

摘要:XML 架构预计将在未来的 XML 处理中扮演核心角色,尤其是在 Web 服务领域,它将作为构建更高级别抽象的重要基础之一。本文详细地说明了如何使用 XML 架构定义语言。(22 页打印页)

简介

1 + 2 = ?

在软件中,回答此类问题所需的信息是由类型系统来提供的。编程语言使用类型系统来简化生成优质代码的任务。类型系统定义了一组可供开发人员在其程序设计中选择使用的类型和操作。一个类型定义一个值空间,或者换句话说,定义一组可能的值。例如,如果上面的操作数被认为是数值类型,答案就可能是 3;但如果它们被认为是字符串型,答案就可能是 “12”,具体情况取决于 “+” 运算符是如何定义的。

类型系统的主要好处之一是,编译器可以使用它在运行前确定代码中是否包含错误,这样就避免了可能产生大量的错误。编译器还可以利用类型系统信息针对给定类型生成操作代码。另外,编译器和运行库都在很大程度上依赖类型系统来确定在使用某个特定类型时如何分配内存空间,这使得开发人员可以不关注这些单调乏味的工作。

许多语言和运行库还允许在运行时以编程方式检查类型信息。这就使开发人员能够考虑得多一点,提出关于类型特征的问题,并且做出基于相应答案的决定。这种在运行时检查类型信息的技术通常被称为反射。在今天的主流编程环境(例如,Microsoft? .NET 框架和 Java)中,反射扮演了重要角色,这有效地减少了开发人员在其代码中必须考虑的问题。在这些编程环境中,虚拟机(例如,公共语言运行库或 JVM)提供大多数程序所需的额外服务(例如,安全、垃圾回收、序列化、远程方法调用甚至是 Web 服务集成)。

edcb0101

图 1. 类型信息的好处

一个定义完善的类型系统以及反射还能够创建更好的工具,以便与这种语言共同使用。开发人员已经能够快速适应许多事情,例如,Microsoft? Intellisense?、代码完成以及那些能够大大加速开发过程的方便的红色 Squiggle。大体说来,一个好的类型系统会提供许多有趣的好处(请参见图 1),其中的大部分好处是容易被当作理所当然、而没有时却让人倍感失落的那种。

XML 1.0 是一个缺乏智能类型系统的语言的典型示例。如果没有类型系统,则在 XML 1.0 文档中找到的信息只能被视为文本。这就要求开发人员事先知道“真正的类型”,以便他们在代码中执行必要的强制。

XML 架构定义语言 (XSD) 为 XML 处理环境提供了一种类型系统。在小容器中,XML 架构可以描述您要使用的类型。符合 XML 架构类型的 XML 文档通常是指实例 文档,这与类和对象间传统的面向对象的 (OO) 关系非常相似(请参见图 2)。这是一种跳离文档类型定义 (DTD) 的基本工作方式的概念切换,它可在映射到传统的编程语言或数据库类型系统时提供更大的灵活性。在这些环境中,XML 架构大大否决了 DTD 的使用。

edcb0101

图 2. OO 与 XML 概念

XML 架构只有在一种完全以 XML 为中心的方式下,才能够提供图 1 所示的全部好处。包含 XML 架构类型信息的逻辑 XML 文档通常被称为后架构验证信息集 (PSVI)。PSVI 使得如下操作成为可能:像在其他编程环境中一样,在运行时执行基于 XML 架构的反射。总的说来,XML 架构预计将在未来的 XML 处理中扮演核心角色,尤其是在 Web 服务领域,它将作为构建更高级别抽象的重要基础之一。本文的剩余部分将更详细地介绍如何使用 XML 架构定义语言。

数据类型:值和词法空间

XML 架构提供了一个内置数据类型 清单,开发人员可以使用它来约束文本(有关帮助图,请参见 W3C XML Schema Part 2:Datatypes Web page)。所有这些类型都可以在 http://www.w3.org/2001/XMLSchema 命名空间中找到。每种类型都有一个定义好的值空间。类型的值空间仅仅是可用在给定类型的实例中的一组值。

edcb0101

图 3. 字节值空间

例如,XML 架构提供了一种名为字节的内置类型,它具有从 -128 到 127 的值空间。另一个示例是 XML 架构中的布尔类型,它的值空间非常简单,因为它只有以下两个值:。共有 44 种内置类型供您选择,每种都有不同的值空间以满足不同数据建模的需要。

图 4 阐释了许多内置类型都被定义为另外一种类型的值空间的子集,也称为通过限制派生。例如,字节型值空间是短整型值空间的子集,短整型值空间又是整型值空间的子集,而整型值空间又是长整型值空间的子集,等等。因此,基本集合论告诉我们,一种派生类型的实例也是它的任一祖先类型的有效实例。(严格地说,它们是 anySimpleType 本身的子集。)

尽管编程语言使用值空间信息来计算需要多大的内存来表示值,开发人员却极少需要担心将它们表示为文本的问题。然而,对于 XML,却不能忽视一个事实,那就是实例将很可能序列化为 XML 1.0 文件,这需要以词法形式表示值。如果每个 XML 架构处理器都独立地决定如何进行此操作,那么互操作性很快就会失去。因此,除了定义每种类型的值空间外,XML 架构还定义了它们所允许的词法表示形式。

edcb0101

图 4. 类型子集

例如,布尔型的真值可以表示为 “true” 或 “1”,而布尔型的假值可以表示为 “false” 或 “0”。双精度型值 10 可以表示为 “10”、“10.0” 或 “10.0000”,甚至可表示为 “0.01E3”。而日期型的“2003 年 1 月 1 日”就可以用词法格式表示为“2003-01-01”。如果使任何类型的词法格式(以及任何可能的变化形式)都符合标准,开发人员就可以不考虑代码实际序列化方式的复杂性,而专门处理代码中的值。

在命名空间中定义类型

除了提供内置类型外,大部分编程语言还允许开发人员定义他们自己的类型,它们通常被称为用户定义类型 (UDT)。在定义 UDT 时,大部分编程语言还允许您用命名空间来限定它们,以便使它们不会与其他恰好与其具有相同名称的 UDT 相混淆。有关 XML 命名空间如何工作的详细信息,请参阅了解 XML 命名空间。图 5 显示了一个 C# 命名空间定义和一个与之类似的 XML 架构定义。正如您所看到的一样,XML 架构还支持在命名空间内定义类型。

edcb0101

图 5. 在命名空间中定义类型

xsd:schema 元素确定命名空间中的内容范围,而targetNamespace 属性指定命名空间的名称。例如,下面的 XML 架构模板定义一个新的名为 http://example.org/publishing 的命名空间:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://example.org/publishing"
   xmlns:tns="http://example.org/publishing"
>

   <!-- type definitions -->
   <xsd:simpleType name="AuthorId">
      <!-- define value space details here -->
      ...
   </xsd:simpleType>

   <xsd:complexType name="AuthorType">
      <!-- define structural details here -->
      ...
   </xsd:complexType>

   <!-- global element/attribute declarations -->
   <xsd:element name="author" type="tns:AuthorType"/>
   <xsd:attribute name="authorId" type="tns:AuthorId"/>
   ...

</xsd:schema>
			

位于 xsd:schema 元素内的所有内容(作为直接子级)都被认为是全局的,因此它们会自动与目标命名空间相关联。在上例中,http://example.org/publishing 命名空间中共有 4 个元素:AuthorIdAuthorTypeauthorauthorId。因此,无论何时在架构内引用其中的一个元素,都必须使用命名空间限定的名称。

为了使用命名空间限定的名称,还将需要另外一个命名空间声明,该声明映射到架构的 targetNamespace 值。上面显示的 “tns” 命名空间声明的作用就在于此。因此,我无论何时需要引用我在架构中定义的内容,都可以在名称前加上 “tns” 前缀,如本例所示。

您可以在 xsd:schema 元素内定义两种类型:简单类型(使用 xsd:simpleType)和复杂类型(使用 xsd:complexType)。简单类型只能分配给纯文本元素和属性,因为它们并不定义结构,而是定义值空间。具有附加结构的元素(例如,带有属性或子元素的元素)必须定义为复杂类型。

除了定义类型,您还可以在架构内定义全局元素(使用 xsd:element)和属性(使用 xsd:attribute),并为它们指定类型。在上例中,我定义了一个名为 author 的全局元素和一个名为 authorId 的全局属性。因为这些构造也是全局的,所以当我在实例文档中使用它们时,必须通过目标命名空间对其进行限定。下面的 XML 文档包含前面定义的 author 元素的一个实例:

<x:author xmlns:x="http://example.org/publishing">
  <!-- structure determined by complexType definition -->
  ...
</x:author>
			

下面的 XML 文档包含全局 authorId 属性:

<!-- authorId value constrained by simpleType definition -->
<publication xmlns:x="http://example.org/publishing"  
   x:authorId="333-33-3333"/> 
			

也可以使用 http://www.w3.org/2001/XMLSchema-instance 命名空间中的 type 属性为实例文档中的元素显式指定类型。这个命名空间包含少数只能用在实例文档中的属性。使用类型属性类似于在一些编程语言中的类型间进行强制转换。下例为 genericId 元素(尚未在架构中定义)显式指定 AuthorId 类型:

<genericId 
  xmlns:x="http://example.org/publishing"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:type="tns:AuthorId"
>333-33-3333</genericId>
			

请注意,AuthorId 和我们指定给上面显示的全局 authorId 属性的类型是相同的。这表明您能够为属性或纯文本元素指定简单类型以约束它们的值。同样,一定要注意到,用于指定类型的 xsi:type 技术只能应用于元素,而不能应用于属性。

定义简单类型

大多数编程语言只允许开发人员将多种内置类型排列为某种结构化类型,而不允许开发人员定义新的具有用户定义的值空间的简单类型。在这一点上,XML 架构有所不同,因为它允许用户定义其各自的自定义简单类型,这些简单类型的值空间是预定义的内置类型的子集。

像前面显示的那样,您可以使用 xsd:simpleType 元素定义新的简单类型。在 xsd:simpleType 元素内,可以指定一个您希望限制(使用 xsd:restriction 元素)其值空间的基类型。在 xsd:restriction 元素内,您可以通过限制一个或多个方面 来准确指定希望如何来限制基类型。例如,下面的简单类型使用 xsd:minInclusivexsd:maxInclusive 方面约束 xsd:doublexsd:date 值空间:

...
   <xsd:simpleType name="RoyaltyRate">
      <xsd:restriction base="xsd:double">
	 <xsd:minInclusive value="0"/>
	 <xsd:maxInclusive value="100"/>
      </xsd:restriction>
   </xsd:simpleType>
   <xsd:simpleType name="Pubs2003">
      <xsd:restriction base="xsd:date">
	 <xsd:minInclusive value="2003-01-01"/>
	 <xsd:maxInclusive value="2003-12-31"/>
      </xsd:restriction>
   </xsd:simpleType>
   <xsd:element name="rate" type="tns:RoyaltyRate"/>
   <xsd:element name="publicationDate" type="tns:Pubs2003"/>
...
			

下面的文档包含上面定义的元素的有效实例:

<x:rate xmlns:x="http://example.org/publishing">17.5</x:rate>
			
				<x:publicationDate xmlns:x="http://example.org/publishing"
				>2003-06-01</x:publicationDate>
			

XML 架构定义了可用于每种类型的方面(请参阅表 1)。大多数方面都不能应用于所有类型(一些方面仅对某些类型有意义)。大多数方面限制了类型的值空间,而模式方面则限制了类型的词法空间。对于值空间和词法空间来说,限制两者中的任一者都会间接地限制另外一个。先前的示例约束了基类型的值空间,而接下来的示例使用正则表达约束了字符串的词法空间:

...
   <xsd:simpleType name="SSN">
      <xsd:restriction base="xsd:string">
	 <xsd:pattern value="\d{3}-\d{2}-\d{4}"/>
      </xsd:restriction>
   </xsd:simpleType>
   <xsd:simpleType name="PublisherAssignedId">
      <xsd:restriction base="xsd:string">
	 <xsd:pattern value="\d{2}-\d{8}"/>
      </xsd:restriction>
   </xsd:simpleType>
   <xsd:simpleType name="Phone">
      <xsd:restriction base="xsd:string">
	 <xsd:pattern value="\(\d{3}\)\d{3}-\d{4}"/>
      </xsd:restriction>
   </xsd:simpleType>

   <xsd:element name="authorId" type="tns:SSN"/>
   <xsd:element name="pubsAuId" type="tns:PublisherAssignedId"/>
   <xsd:element name="phone" type="tns:Phone"/>
...
			

下面的文档包含上面定义的元素的有效实例:

<x:authorId xmlns:x="http://example.org/publishing"
>123-45-6789</x:authorId>
			
<x:pubsAuId xmlns:x="http://example.org/publishing"
>01-23456789</x:pubsAuId>
			
<x:phone xmlns:x="http://example.org/publishing"
>(801)390-4552</x:phone>
			

只有与正则表达式(在模式方面中指定)相匹配的字符串才被认为是给定类型的有效实例。

方面元素 说明

xsd:enumeration

指定一个该类型必须匹配的固定值。

xsd:fractionDigits

指定小数点右侧十进制位数的最大值。

xsd:length

指定基于字符串的类型中的字符数量、基于二进制的类型中的八位字节数量或者基于列表的类型中的项数量。

xsd:maxExclusive

指定该类型的值空间的上限(不包括上限)。

xsd:maxInclusive

指定该类型的值空间的上限(包括上限)。

xsd:maxLength

指定基于字符串的类型中字符的最大数量、基于二进制的类型中的八位字节的最大数量或者基于列表的类型中项的最大数量。

xsd:minExclusive

指定该类型的值空间的下限(不包括下限)。

xsd:minInclusive

指定该类型的值空间的下限(包括下限)。

xsd:minLength

指定基于字符串的类型中字符的最小数量、基于二进制的类型中的八位字节的最小数量或者基于列表的类型中项的最小数量。

xsd:pattern

基于正则表达式指定一个该类型必须匹配的模式。

xsd:totalDigits

为从数字派生的类型指定十进制位数的最大值。

xsd:whiteSpace

指定空白正常化规则。

表 1. 方面

另一个有趣的方面是 xsd:enumeration,它允许将值空间约束为枚举值列表。下面的示例将 xsd:NMTOKEN 的值空间约束为四个特定的枚举值:

...
   <xsd:simpleType name="PublicationType">
      <xsd:restriction base="xsd:NMTOKEN">
	 <xsd:enumeration value="Book"/>
	 <xsd:enumeration value="Magazine"/>
	 <xsd:enumeration value="Journal"/>
	 <xsd:enumeration value="Online"/>
      </xsd:restriction>
   </xsd:simpleType>
   <xsd:element name="pubType" type="tns:PublicationType"/>
...
			

下面的文档包含上面定义的元素的有效实例:

				<x:pubType xmlns:x="http://example.org/publishing"
				>Online</x:pubType>
			
派生元素 说明

xsd:restriction

新类型是现有类型的限制,这表示新类型具有一组范围更窄的合法值。

xsd:list

新类型是另一个简单类型的、用空白分隔的列表。

xsd:union

新类型是两个或更多其他简单类型的联合。

表 2. 简单类型的构造技巧

除了限制类型的值空间外,还可以构造新的作为其他简单类型的列表联合 的简单类型。为此,要使用 xsd:listxsd:union 元素,而不使用 xsd:restriction(请参阅表 2)。在使用 xsd:list 时,实质上是在从指定的值空间定义一个用空白分隔的值列表。值得提醒的是,在使用 xsd:listxsd:union 时,不像使用 xsd:restriction 时那样具有派生层次结构,因此在这些情况下不能应用类型兼容性。下例将名为 AuthorList 的新类型定义为 SSN 值列表。

...
   <xsd:simpleType name="AuthorList">
      <xsd:list itemType="tns:SSN"/>
   </xsd:simpleType>
   <xsd:element name="authors" type="tns:AuthorList"/>
...
			

下面的文档包含 authors 元素的有效实例:

<x:authors xmlns:x="http://example.org/publishing"
>111-11-1111 222-22-2222 333-33-3333 444-44-4444</x:authors>
			

对于 xsd:union 来说,是在创建一种可将多个值空间组合到一个新的值空间中的新类型。联合类型的实例可以是所指定的任何值空间中的值。例如,下面的名为 AuthorId 的类型将 SSN 值空间与 PublisherAssignedId 值空间组合在一起:

...
   <xsd:simpleType name="AuthorId">
      <xsd:union memberTypes="tns:SSN tns:PublisherAssignedId"/>
   </xsd:simpleType>
   <xsd:element name="authorId" type="tns:AuthorId"/>
...
			

下面的每个文档都显示 authorId 元素的一个有效实例:

<x:authorId xmlns:x="http://example.org/publishing"
>111-11-1111</x:authorId>
			
<x:authorId xmlns:x="http://example.org/publishing"
>22-22222222</x:authorId>
			

XML 架构对用户定义类型(以及更具体的自定义值空间/词法空间)的支持是这种语言更强大的方面之一。由于大多数编程语言不提供该支持,因此开发人员不得不在他们的应用程序代码中处理此类问题(通常是通过属性的 setter)。这种可定义能够完全满足您的需求的自定义值空间/词法空间的功能使错误处理和验证代码问题降低一个难度级别。

...
   <xsd:complexType name="AuthorType">
      <!-- compositor goes here -->
   </xsd:complexType>
...
			

定义复杂类型

XML 架构允许将不同的简单类型(或值空间)排列为结构(也称作复杂类型)。可以使用 xsd:complexType 元素在架构的目标命名空间内定义新的复杂类型,如下所示:

xsd:complexType 元素包含所谓的合成器,合成器描述类型内容的合成,因此又被称作该元素的内容模型。XML 架构定义了三个可用在复杂类型定义中的合成器:xsd:sequencexsd:choicexsd:all(请参阅表 3)。

出处:世纪开元网上冲印搜集整理 作者:佚名
评论人 评论内容摘要(共 条,查看完整内容) 得分 发表时间
本类热点
01.关于vc的mshflexgrid控件的用法(转载:原地址:..
02.用实例学:ASP.NET的include的用法
03.ListView的使用
04.ASP.NET POST方式提交数据!
05.正态分布的随机数发生器 in C#
06.在.net安装程序中部署oracle客户端全攻略
07.蛙蛙推荐:C#编码规范.doc
08.在ASP.NET中处理datetime的一些通用函数(VB)
09.用户 NT AUTHORITY\NETWORK SERVICE 登录失败解决..
10.破译动网验证码的简单方法
本类推荐
网上数码冲印专用QQ:71086443  网上数码冲印专用MSN:photo36588@hotmail.com 网上冲印热线电话:0531-82678928
http://www.36588.com.cn 世纪开元数码照片网上冲印©2001 - 2008
网站地图 | 冲印知识 | 会员利益 | 服务价格 | 质量承诺 | 服务条款 | 隐私政策 | 商业合作 | 关于我们