查询包含名称空间的XML数据

http://tech.ddvip.com   2007年07月03日    社区交流

内容摘要:如果想学习关于 XQuery 与 SQL/XML 的基础以外的更多知识,那么必须理解文档和消息中的 XML 名称空间对查询的语义的影响。否则,就可能收到意外的结果。幸运的是,学习如何查询包含名称空间的 XML 文档并不难。本文提供了一些例子来帮助您起步。

  您可能想知道,为什么这个查询中出现了一个 WHERE 子句。严格地说,这不是必需的。因为 PARTNERS 表中的每个 XML 文档都包含一个 <company> 根元素,您只需检索所有公司信息,而不必理会名称空间。然而,如果 PARTNERS.DETAILS 中有一个包含根元素 <firm> 的文档,而在查询中又忽略了上述 WHERE 子句,那么对于那个文档,DB2 返回的是空记录。这是由于 SQL 的语义导致的:没有了 WHERE 子句,SQL 查询就不会在返回的结果集中过滤掉表中的任何行。因此,如果使用 SQL/XML 查询 XML 数据,就必须包括一个 WHERE 子句,并在其中使用 XMLExists() 函数(或其他过滤谓词)来确保结果中不会为表中的每个行都包括一行。

  案例 2:返回选定名称空间中的所有 XML “company” 数据

  常常需要将对 XML 数据的查询限制在特定的名称空间内。本节考虑如何获得与名称空间 urn:xmlns:saracco-sample:company1.0 相关联的所有有关公司的 XML 文档。

  在 DB2 中,必须在查询中声明相关的名称空间。清单 11 为一个 XQuery 表达式声明一个默认的名称空间:

  清单 11. 在 XQuery 中声明默认名称空间xquery declare default element namespace "urn:xmlns:saracco-sample:company1.0";

  这个子句不能独立运行。若独立运行则会产生一个 SQL16002N 错误。名称空间声明之后必须紧随着要发出的 XQuery。这个例子声明一个默认的名称空间,并指示 DB2 检索关于与那个名称空间相关联的所有公司的信息:

  清单 12. 使用默认名称空间的 XQueryxquery declare default element namespace "urn:xmlns:saracco-sample:company1.0";
db2-fn:xmlcolumn('PARTNERS.DETAILS')/company%

来源:ibm.com    作者:C. M. Saracco    责编:豆豆技术应用

正在加载评论...