对象
XML schema是W3C的推荐选择,它提供了定义XML文件的结构,内容和语义的工具。与另外两个schema建模工具文件类型定义(DTD)和XDR (XML Data Reduced)相比,XML schema具有两个关键优势。第一,由于它是针对定义XML数据结构的W3C官方推荐,所以公司组织都将采用同样的定义。第二,它是最新的schema技术,因此它的建构就是要修正另外二者中存在的漏洞和缺陷,特别是在DTD之中的。
XDR并不是一个schema技术的备选方案,因为它只是微软公司的XML schema规范的一个早期草稿。在.NET之中,XDR主要是为了向下兼容性而被支持。SQL Server 2000的XML扩展和微软公司的COM parser (MSXML)仍然对其广泛地使用。
我们开始先来看看XML schema对象模型是如何让你使用.NET的类来操作schema部件的。然后,我们看一看处理schema信息的几种途径。
Schema背景
XML schema代表着XML类型系统并应在他们向其他应用软件和平台序列化他们的状态时被用来描述类和对象。.NET XML schema对象模型(SOM)可以帮助在.NET-specific类型系统和XML schema类型系统之间建构一个桥梁,并使计划性地创建和修改schema变得容易。Schema文件是一个带有.xsd扩展名的XML文件。
所有可以在XML schema文件中使用的数据类型都有一个.NET的副本。一旦一个XSD schema被编译为.NET表述(representation)对象模型,你就可以使用SOM类来访问他们了。Schema编译器将XSD装配到一个XmlSchema对象之中,这个对象通过属性和方式显示了schema的信息。
在一个给定的平台上,在XSD和一个合成二进制类之间的一个有效的序列化机制提供了巨大的潜力,它是实现完全的跨平台互操作性的一个关键步骤。在.NET中,XML序列化是通过XmlSerializer类并利用XML schema定义工具(Xsd.exe)的服务来实现的。这个工具是.NET Framework SDK中的二进制可执行文件,你将会在.NET Framework安装路径中的BIN子目录中找到它,这个路径通常是C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK。
Xsd.exe可以从一个XSD文件中产生一个C# 或是Visual Basic类并从一个XML源文件中推断出一个XML schema。这个工具还负责由Visual Studio .NET执行的XML中与schema相关的技术。
检查SOM
.NET Framework提供一个类的等级来编辑现有的schema或是从头开始创建一个新的schema。类在System.Xml.Schema名称空间中被定义,名称空间中的根类是XmlSchema。一旦应用软件保留一个类的实例,他们就可以加载一个现有的XSD文件并利用所包含的信息构成内部属性和集合,通过使用XmlSchema编程界面,你就可以加入或编辑元素,属性和其他schema部件。最后,类提供一个Write方式,使你可以对有效的流对象保存目前的内容。
创建一个XmlSchema类的实例有两个途径:你可以使用缺省的建构器,它将返回一个新的空的类的实例,或者你也可以使用静态的Read方式。
Read方式通过一个流,文本阅读器或是XML阅读器在可用的schema信息上运行,被返回的schema还没有被编译。Read方式接受一个second argument,它是一个验证事件处理器。你可以将这个argument设置为空,但是不能在被读取的schema之中找到并处理验证错误。表A中显示了如何使用.NET SOM来读取和编译一个schema。
一旦schema被编译,你就可以访问由post-schema有效性信息组所定义的schema的组成元素,要访问schema中的实际类型,你需要使用SchemaTypes集合。
在编译之前和之后的信息之间的不同点之一是,一个所含(不是事先被定义的)的合成类型只有在schema被编译之后才会被查出。例如,假设你使用<xs:include>标签来引入一个外部类型定义,要系统性地查找类型的存在,你必须首先对schema进行编译。处理过程将对<include>声明进行扩展并加入到类型定义之中。
在表B中的代码显示了在编译之后如何得到在指定的schema中定义的合成类型的列表。
一旦schema被读取至内存,你就可以自由地操纵它的结构,而间接标签,例如<include>和<import>,只被识别为个体或单个对象。换句话说,他们只代表自己而不是他们要包括或是引入的内容。
应用软件和内嵌schema
要让客户机应用软件了解他们从服务器得到的XML数据的结构,schema信息是基础。然而,schema信息也是一个额外的负担,特别是在分布式应用软件之中,它会占去一部分带宽。
在一些情况下,你可以像对待Windows可执行文件中的调试信息那样对待schema:在应用软件的开发过程中不可或缺,而一旦应用软件被发布就毫无用处。这个模式并不应用于所有的应用软件,但是它形成了一个有趣的优化形式。一旦两个互相通信的模块对于一个XML格式达成一个,而在软件中又是hard-coded,那么XML数据的格式怎么能够以不同的方式进行交换呢?
当XML文件还没有完全被有关的应用软件所控制时,schema的确认就不再是一个可选择的功能。可以想到的第一个方法就是让客户机应用软件在本地存储schema并在需要验证引入的文件时对其进行加载。对于.NET应用软件,XmlSchema.Read静态方式就是你在加载现有schema文件时所需要的。另一个方法需要动态地创建并编译一个schema对象,然后用它来验证文件。XML验证还提供另一个方式来确保这个文件处于所期望的形式。
结论
有了XML schema,你就可以以一种非常严格的形式来描述文件的版面设计,让用户不必再去空想。就像我们在这里看到的,XML schema对象模型使你能够利用.NET Framework之中的schema支持。