克服 OpenXML 障碍

如何在实际应用程序中为 OpenXML 作好准备

Rich Rollman

如果您正在编写使用 XML 作为数据交换格式的应用程序,您需要用一种方法从 XML 文档提取数据,并将该数据存储在您的数据库中。T-SQL 的 OpenXML 关键字是一种在 SQL Server 2000 中插入、删除和更新数据的简便方法。OpenXML 在 T-SQL 存储过程内创建 XML 文档的一个或多个关系视图(或行集合)。您可以访问那些视图中的数据,以便对您的数据库执行关系操作。虽然 OpenXML 相当易于使用,但在实际应用程序中使用它之前,您需要克服几个障碍。我已经在 Exploring XML 专栏 2001 年 7 月的文章 (InstantDoc ID 21077) 和 2001 年 8 月的文章 (InstantDoc ID 21259) 中讨论了最大的障碍 — 将 XML 文档传递到存储过程时遇到的困难。现在让我们来看看两个您可能遇到的其他常见的 OpenXML 障碍。

声明命名空间前缀

实际应用中的 XML 文档使用命名空间受限的元素来确保处理数据的应用程序正确地解释文档。如果您的应用程序使用 OpenXML 从 XML 文档提取数据,您可能需要在某一点将命名空间受限的元素指定为 OpenXML 用于构造关系视图的行模式和列模式的 XPath 查询。行模式使用 XPath 查询从 XML 文档选择与关系视图中的行相对应的元素。列模式使用 XPath 查询为每一行选择列。指定命名空间受限的元素或属性可能是个挑战,尤其是在您不知道在 XML 中将使用哪些前缀的情况下。命名空间前缀提供了一种简化的方法,以便指定元素或属性属于由统一资源标识符 (URI) 定义的特定命名空间。您不能依靠与特定命名空间相关联的前缀,因为命名空间规范允许您随意选择前缀,甚至允许不同的前缀对应于同一个命名空间。(有关命名空间规范的更多信息,请参见 Namespaces in XML 规范,网址是 http://www.w3.org/TR/1999/REC-xml-names-19990114/。)不过,通过使用系统存储过程,您可以克服未声明的命名空间前缀的问题。

Sp_xml_preparedocument 是一个系统提供的存储过程,T-SQL 可用它将 XML 文档解析为内存中的表示形式,并将一个数字句柄返回到内存中的文档。OpenXML 使用此句柄来获得 XML 文档的内存中的表示形式,并生成一个合并了该文档包含的数据的行集合。如果您以前使用过 sp_xml_preparedocument,您应该很熟悉第一个参数(XML 文档的内存中的表示形式的句柄)和第二个参数(解析到内存中的 XML 文档)。但可能令您感到惊讶的是,您可以将第三个可选参数传递到 sp_xml_preparedocument。此参数包含为您可以在 OpenXML 语法中使用的命名空间声明前缀的 XML 文档。您只需为该文档编写一个根元素,然后在上面加入命名空间声明即可。例如, XML 文档为与 "urn:myPerson" URI 相关联的命名空间声明前缀 p。然后,您可以在自己的 XPath 查询中使用来自这些命名空间声明的前缀,以便创建一个包含命名空间受限的属性或元素中的数据的行集合。下面我们来看一个实际的例子。

清单 1(第 42 页)展示了一个简单的 XML 文档,它包含有关一本图书的信息,包括书的标题和作者的头衔。这些规范产生了不确定性,因为您使用

转到原英文页面