** 将 SQLXML 3.0 用起来 ** ( Web Services, XML Views, Managed Classes )
小气的神
2002-5-25
Article Type: Overview
难度等级: 5/9
版本: 4.16
产生映射文件
如何创建一个映射文件呢?首先它是一个 XML 文件,过去 Microsoft 推荐使用 XDR ( XML-Data Reduced )来定义,英文的全称是“ Creating XML Views by Using Annotated XDR Schemas ”, Annotated 我不知如何翻译它更形象。 SQLXML 3.0 之后 Microsoft 开始支持使用更加规范的 Annotated XSD Schemas 来完成过去 XDR 的定义功能,并且提供一个工具 Cvtschema.exe( 安装路径的 Bin 目录下 ) 来完成将原来 XDR 定义的文件转换成 XSD 格式的。但问题是我们还是需要产生一个 XSD 或 XDR 的文件。
即使在过去使用 XDR ,产生一个映射文件仍然是一件比较枯燥的事情,手工产生一个基本的 Schema 文件似乎是必须的,但对于一个从未使用过 XDR 或 XSD 的人来说是痛苦的,这就像你要给一个 XML 文件产生一个 XSLT 文件一样,无论你多么希望有一个工具能根据 XML 自动产生一个,但事实上我们发现手工的方式远比工具更有成效。我在不了解这个道理之前,把希望聚集在 Microsoft 提供的 SQL Server XML View Mapper 这个工具上,最失望是它在自动化之前,仍然要求我提供一个 XDR 文档(我开始明白 Mapper 的意义,因为它只对映射自动, Schema 文件还是要你自己产生)。即使它能够自动化一部分功能(为你自动加上 sql : relation 等 XML 模板元素),很快我还是放弃使用它,因为它的新版本可能会更好,会支持 XSD Schema ,而不是向现在这样只支持 XDR Schema 。必须承认当你从事稍微大一点的应用,比如十几张表,二十几个映射文件时,每次从头定义开始定义几乎类似的 Schema 板文件就变得痛苦和冗长起来。

(XML View Mapper 界面 )
之后我花了几个小时,翻起 dotNET 中有关 XML 的 API 手册,开始跌跌撞撞的写一个根据数据库自动产生 Schema 文件的工具,它基本是默认映射也就是说几乎不需要再加 Annotate ,真正应用中你可能仍然需要根据具体的情况加入一些其它的 Annotate 。我希望它能根据数据库中的 Table ,自动产生 Schema 文件,这样我只要 Copy 它到 IIS 的模板目录中就可以着手下一步的编码和存取 XML 数据部分(当然我们会看到,也就是第四个特点中要讲的)。事实上最后它的功能 ” 非常强大 ” ,我不断地加入参数的处理,使得它能产生更多的相关文件。
这个小工具 WriteXSD.exe( 暂且允许我这么称呼它吧 ) ,能够从一个数据库的表中产生和预览我们需要的 Schema 。

然后我们运行下面的命令:
WriteXSD /c:Attribute /t:xsd /o:EmplyeesA.xml /m:EmplyeesO.xml Employees

如果成功我们将获得两个文件 EmplyeesA.xml 和 EmplyeesO.xml 一个是 Schema 文件,另外一个是模板-映射文件,然后我们将它们 Copy 到我们先前设置的目录,一个是 \Schemas 一个是 \Templeas 之后我们执行下面的命令: http://localhost/Northwind/Templates/EmplyeesO.xml
我们会看到下面的结果,基本上它是按我们生成的 EmplyeesA.XML 产生的,当然还是有些小小的问题比如 Photo 这个字段,它应当是图片类型,而在 EmplyeesA.xml 只是简单的 type=”’xs:string”( 这个版本里任何字段我都转换成 string 类型 haha) 可以清晰的看到这个字段这样显示出来 :
FRwvAAIAAAANAA4AFAAhAP////9CaXRtYXAgSW1hZ2UAUGFpbnQuUGljdHVyZQABBQAAAgAAAAcAAABQQnJ1c2gAAAA…... 对于这个显示我很抱歉 :) , 下一个版本也许应该加上数据库字段类型和 XSD 数据类型的转换。

当然在某个不久之后,我发现也有其他的方法产生 Annotated schemas : VS.NET 的方法,新建一个 XML Schema ,然后在 VS 中拖拽你需要的 Table 到设计视图上比如下面这样

切换到 XML 视图中我们看到是大致下面的代码,然后手工删除掉黑色斜体带下划线的部分。
< xs:schema id ="Employyes" __ targetNamespace="http://tempuri.org/Employyes.xsd" _ _ elementFormDefault ="qualified" xmlns ="http://tempuri.org/Employyes.xsd" xmlns : mstns ="http://tempuri.org/Employyes.xsd" xmlns : xs ="http://www.w3.org/2001/XMLSchema" xmlns : msdata ="urn:schemas-microsoft-com:xml-msdata">
__
1<xs:element name="Document"> _ _
2
3_ _ <xs:complextype> _ _
4
5_ _ <xs:choice maxoccurs="unbounded"> _ _
6
7< xs:element name ="Employees">
8
9< xs:complexType >
10
11< xs:sequence >
12
13< xs:element name ="EmployeeID" msdata : ReadOnly ="true" msdata : AutoIncrement ="true" type ="xs:int" />
14
15< xs:element name ="LastName" type ="xs:string" />
16
17< xs:element name ="FirstName" type ="xs:string" />
18
19< xs:element name ="Title" type ="xs:string" minOccurs ="0" />
20
21< xs:element name ="TitleOfCourtesy" type ="xs:string" minOccurs ="0" />
22
23< xs:element name ="BirthDate" type ="xs:dateTime" minOccurs ="0" />
24
25< xs:element name ="HireDate" type ="xs:dateTime" minOccurs ="0" />
26
27< xs:element name ="Address" type ="xs:string" minOccurs ="0" />
28
29< xs:element name ="City" type ="xs:string" minOccurs ="0" />
30
31< xs:element name ="Region" type ="xs:string" minOccurs ="0" />
32
33< xs:element name ="PostalCode" type ="xs:string" minOccurs ="0" />
34
35< xs:element name ="Country" type ="xs:string" minOccurs ="0" />
36
37< xs:element name ="HomePhone" type ="xs:string" minOccurs ="0" />
38
39< xs:element name ="Extension" type ="xs:string" minOccurs ="0" />
40
41__ <xs:element minoccurs="0" name="Photo" type="xs:base64Binary"></xs:element> _ _
42
43< xs:element name ="Notes" type ="xs:string" minOccurs ="0" />
44
45< xs:element name ="ReportsTo" type ="xs:int" minOccurs ="0" />
46
47< xs:element name ="PhotoPath" type ="xs:string" minOccurs ="0" />
48
49
50</xs:choice></xs:complextype>
51</xs:element>
__ _ _
__ _ _
__
1<xs:unique msdata:primarykey="true" name="DocumentKey1"> _ _
2
3__ <xs:selector xpath=".//mstns:Employees"></xs:selector> _ _
4
5__ <xs:field xpath="mstns:EmployeeID"></xs:field> _ _
6
7__ </xs:unique>
_ _
__ _ _
保存这个文件,然后将它 Copy 到我们设定的 /Schemas 目录中。

无论如何手工的方式永远都存在,只是说我们可以选择一种相对适合我们自己的方式来解决枯燥的操作。最后我不知道自己会喜欢哪种方式,不过从这之后有关于产生 Annotated schemas 对我来说变成一件有趣而不是很痛苦的事情了 (haha)
这之前我们讲述和看到的都是用手动或是直接的方式展现一些 SQL 2000 和 SQLXML 的特性,而后我们来看一些另外的功能――如何使用程序的方式来利用 SQLXML 的功能。这也是我们要讲的下一个特性了。
_
_
_ 特别说明: _
本文原创, CSDN 署名首发,所有文字和图片版权所有。未经授权请勿传播、转载或改编。
如果有问题或建议, 请发电子邮件给 [email protected]