定义 XML 视图

批注将关系数据库映射到虚拟 XML 文档中

Rich Rollman

如果您需要用特定的 XML 词汇从 SQL Server 数据库中抽取数据,XML 视图是可选的一项好技术。谈到 XML 词汇,我指的是符合构成 XML 文档所认可的元素和属性格式设置的 XML。。通过生成 XML 架构定义 (XSD) 架构或使用预先生成的架构,您可以定义词汇。通过将批注(将数据定位在您的关系数据库内的其他元素和属性)添加到任何标准的 XSD 架构,您可以构造 XML 视图。批注定义出 XML 和您的关系数据库架构之间的映射。可将得到的 XML 视图看作是一个虚拟 XML 文档,此文档包含存储在数据库中的数据。SQL Server 2000 和 SQL Server 2000 Web Release 3 (SQLXML) 支持多种批注,这些批注将存储在 SQL Server 中的数据映射到架构所描述的一个 XML 文档实例中。

我在“在 XML 视图中筛选值”(在 2002 年 10 月发表,InstantDoc ID 26715)一文中,展示了如何用 limit-value 和 limit-field 批注来生成一个已筛选的 XML 视图,此视图只含有这两种批注指定的值。在此专栏中,我将向您展示如何使用其他一些批注,通过 XSD 架构指定的词汇从 SQL Server 中获取 XML 结果。开始前,要考虑 清单 1显示的 XSD 架构。架构指定了一个 XML 词汇,它包括作者、出版物和书店。我用此专栏中的架构示例阐释了如何使用架构内的批注生成 XML 视图。下边的示例将 清单 1 的架构所定义的元素和属性映射到 SQL Server 中包含的 Pubs 示例数据库。构造架构时,我特别选择不同于 Pubs 数据库中表名的 XML 名称,以免其后的说明使人混淆。

首先,让我们详细审视 清单 1 的架构。此架构定义了三种 XSD 复杂类型,可看作编程语言中的结构或类,或看作数据库表结构。WriterType 表示作者姓名和电话号码,PublicationType 为作者出版的书命名,BookstoreType 表示出售出版物的书店。架构还声明了三种使用这些类型的元素嵌套级别。Writers 元素包括一系列 Writer 元素,且每个 Writer 元素包含一系列 Publication 子元素,Publication 子元素表示此作者出版的书。Bookstores 元素包括一系列 Bookstore 元素,每个 Bookstore 元素包含与书店同处一州的一系列作者。您可用 Writers 或 Bookstores 作为虚拟文档的根元素。现在来看看可以用来从 清单 1 的架构和 Pubs 数据库生成 XML 视图的一些批注。

本页内容

Relation 和 Field Relation 和 Field
Relationship Relationship
Key-Fields Key-Fields
Is-Constant Is-Constant
使用 XML 视图运行查询 使用 XML 视图运行查询

Relation 和 Field

最常用的批注是 relation 和 field。这些批注定义了如何将数据从表的列中或 SQL Server 数据库的视图中映射到 XML 架构中的一个元素或属性。将表名映射到 XML 元素,以创建用于表中每一行的一个元素实例。将列映射到 XML 元素或属性,会将其列值作为 XML 视图中的元素内容或属性值插入。我在“用 XML Bulk Load 加载 ADO 生成的 XML 数据”(2002 年 3 月发表,InstantDoc ID 23699)一文中,说明了 relation 和 field。但在进一步讨论之前,我想先说明一下默认映射,因为它影响到我后边将要说明的其他批注的行为。

SQLXML 将默认映射应用于每个映射架构。默认映射自动将映射架构中的名称与 SQL Server 数据库中的名称关联起来。XSD 架构中定义的复杂类型映射到数据库中的同名表中,简单类型映射到那些表中的列中。如果您的数据库架构一对一地映射到定义 XML 视图的 XSD 架构,就无需添加批注。但此种一对一的映射几乎从不发生,因为表名通常是复数(例如,Customers、Orders),而相应的 XML 实体是单数(例如,Customer、Order)。通常,需要用 relation 和 field 批注来指定映射。

Relationship

Relationship 是第二个最常用的批注。您需要使用 relationship 批注,这是因为关系数据库通常都是规范化的 ?? 组织成一系列的表 ?? 且每个表都包含用于特定实体的数据。要将表中数据映射到 XML 文档,您可使用 relationship 批注来指定列,这些列关联(或联接)来自多个表中的数据。在以前的 SQL Server Magazine 专栏中已经讨论了这一主题,故在此不再重复全部详细内容。但我想展示一下如何链接 relationship 批注去支持数据库中的多对多 (M:N) 关系。

在关系数据库中,通过使用一个联接表在两个实体间生成 M:N 关系,此联接表中有两列是有关实体的外键。例如,在 Pubs 数据库中,使用 titleauthor 表中的行将作者和他们所写的标题联系起来。在 清单 1 的 XSD 架构中,含有一系列 Publication 元素的 Writer 元素表示同样的数据。要在 XML 文档中生成此结构,需要一种方法通过 titleauthor 表进行映射,从而获得一个给定作者的全部标题。这可以通过链接多个 relationship 元素实现,如清单 2中标注 A 所示。要注意第一个 relationship 元素指定了作者与 titleauthor 表之间的映射,第二个 relationship 元素指定了 titleauthor 和标题表之间的映射。这两个 relationship 元素共同产生只与给定作者相关联的标题,给定作者作为 XML 视图中 Writer 元素的 Publication 子元素。您可以将这一生成分层 XML 视图的链接技术应用于数据库中任意数目的表。

Key-Fields

key-fields 批注指定一个或多个列作为表或视图的唯一键,通过使用 relation 批注或默认映射,此表或视图被映射到 XML 元素或属性。当 SQLXML 在 XML 视图上处理 XPath 查询时,SQLXML 生成一个由 SQL Server 2000 处理的 FOR XML EXPLICIT 查询。FOR XML EXPLICIT 查询对从数据库中检索出的行的排序很敏感,这些行随后被处理成 XML 结果。当用来联系 relationship 批注指定的两个实体的列没有引用数据库表的唯一键时,key-fields 保证正确的排序和正确的 XML 结果。实际上,Microsoft 建议,无论在哪里使用 relation 批注,都要指定 key-fields,以确保产生正确的 XML 结果。我们来看一个需要 key-fields 批注的示例。

清单 1的架构包含一个 BookstoreType 复杂类型,表示出售某个作者出版物的书店。架构指定,每个 Bookstore 元素包含一系列 Writer 元素。现在,我们来谈谈只有在作者与书店同处一州时,才能将 Writer 元素包括在 Bookstore 元素内。您需要用一个 relationship 批注来指定 SQLXML 使用其相应表中的 state 列将 Writers 和 Bookstores 联系起来。但要注意,state 列不是任一表的键。要获取正确的结果,需要将 key-fields 批注包括在 Bookstore 和 Writer 元素中,如同清单 2中的标注 B 和 C 所示。

Is-Constant

您可能已经注意到我还没有讨论 清单 2 架构中的 is-constant 批注。您可对那些并未映射到数据库的任何表或列的元素或属性使用 is-constant 批注,该批注通常对 XML 文档中的容器元素使用。本文中,我用“容器元素”代表将一组类似的元素组成集合的元素。例如,清单 1 的容器元素是 Writers,保留一系列 Writer 元素,Bookstores 保留一系列 Bookstore 元素。您会记起,SQL Server 是将默认映射应用于所有架构的,因此,由于架构声明 Writers 和 Bookstores 为复杂类型,默认映射就会试图将元素映射到数据库中名为 Writers 和 Bookstores 的表中。但是,这些表并不存在,因此,通过插入值为 true 的 is-constant 批注,来指定元素或属性需要包括在 XML 视图中,但不从数据库中生成。清单 2 中的标注 D 显示了 Writers 和 Bookstores 元素的 is-constant 批注。

使用 XML 视图运行查询

既然已经在 清单 1 的架构和 Pubs 数据库之间生成映射,就可以查询这种映射所定义的 XML 视图,产生 XML 查询结果。用 清单 2 定义的 XML 视图执行查询的最简便方法就是创建一个 SQLXML 虚拟目录,该虚拟目录启用了 XPath 查询。可以通过将 清单 2 的映射架构保存到计算机上一个名为 catalog_map.xml 的文件来启动这一过程。在 Inetpub 目录下选择一个目录以避免使用架构执行查询时产生文件权限问题。现在用 IIS 虚拟目录管理创建一个虚拟目录,IIS 虚拟目录管理用于 Microsoft 管理控制台 (MMC) 的 SQLXML 插件。将此虚拟目录命名为 Dec2002,将本地路径设置为在前一步骤中保存映射架构的目录,输入安全参数以访问 Pubs 数据库,然后在 Settings 选项卡上选择 Allow XPath 复选框。在 Virtual Names 选项卡上,创建一个名为 schema 的虚拟名称,将其类型选为 schema,然后将路径设置为 (.),它将使用为虚拟目录指定的相同目录。

配置虚拟目录之后,可以使用 Internet Explorer (IE) 5.0 或更高的版本在 XML 视图上执行 XPath 查询。将 URL 键入 IE 地址栏,试做下列查询:

此查询返回一个 XML 文档,该文档针对 authors 表中每一行包含一个 Writer 元素。每个 Writer 元素都包括与作者相关的 titles 表中每一标题的 Publication 子元素。

此查询返回一个 XML 文档,该文档为 stores 表中每一行包含 Bookstore 元素。仅当作者与书店同处一州情况下,每个书店才针对 authors 表中的行包含 Writer 元素。

在两个 URL 中,Dec2002 引用您创建的虚拟目录,schema/catalog_map.xml 引用从 清单 2 保存的映射架构。URL 的其余部分是在 XML 视图上执行的 XPath 查询。在后面的专栏中,我将为大家展示如何使用更多的批注。同时,我希望读者通过修改批注或运行不同的 XPath 查询,来体验从 清单 2 中映射架构的乐趣。

错误、评价、建议 法律 隐私 广告

版权所有 2002Penton Media, Inc保留所有权利。

转到原英文页面