阅读内容 

定义 XML 视图

[日期:2005-11-01] 来源:中文MSDN  作者:佚名 [字体: ]

如果您需要用特定的 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 文档实例中。-ovp76lY

我在“在 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 名称,以免其后的说明使人混淆。-ovp76lY

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

*
 
本页内容
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。但在进一步讨论之前,我想先说明一下默认映射,因为它影响到我后边将要说明的其他批注的行为。-ovp76lY

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

Relationship

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

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

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 批注的示例。-ovp76lY

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

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 批注。-ovp76lY

使用 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,然后将路径设置为 (.),它将使用为虚拟目录指定的相同目录。-ovp76lY

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

http://localhost/Dec2002/schema/catalog_map.XML/Writers-ovp76lY

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

http://localhost/Dec2002/schema/catalog_map.XML/Bookstores-ovp76lY

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

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


阅读:
录入:

推荐 】 【 打印
相关新闻      
本文评论       全部评论
发表评论
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款


点评: 字数
姓名:
Advertisement
内容查询


Advertisement