查询包含名称空间的XML数据
http://tech.ddvip.com 2007年07月03日 社区交流
内容摘要:如果想学习关于 XQuery 与 SQL/XML 的基础以外的更多知识,那么必须理解文档和消息中的 XML 名称空间对查询的语义的影响。否则,就可能收到意外的结果。幸运的是,学习如何查询包含名称空间的 XML 文档并不难。本文提供了一些例子来帮助您起步。
对于应该如何使用名称空间这个问题,很多 IT 专家意见不一。有人提倡在文档和模式中经常、广泛地使用名称空间,而其他人则认为应该慎用或者不用。如果您对这样的争议感兴趣,那么请参阅 参考资料 小节。在本文中我无意介入这场争论。我只准备解释如何查询包含名称空间的 XML 数据,因为您在工作当中很可能会遇到名称空间。
那么,什么是名称空间?名称空间是由一些惟一的 XML 元素名称和属性名称组成的一个集合,这些名称由一个统一资源标识符(Uniform Resource Identifier,URI)标识。这些 URI 常常看上去像是 Web 站点 URL(也就是说,它们包括像 http://www.w3.org 这样的域名),但有时候也使用统一资源名称(Universal Resource Name,URN)。不管是何种情况,URI 并不真正从指定位置检索数据。如果 URI 以 URL 的形式出现,那么甚至不需要引用一个实际的 Web 页面;它可以是一个 “伪” URL,只是作为一个标识符。
XML 名称空间使用 xmlns 关键字来声明。清单 1 显示了用于一个 XML 文档中元素的两个有效名称空间声明。<employee> 有一个基于 URL 的 URI,而 <partner> 元素则有一个基于 URN 的 URI。
清单 1. 示例名称空间声明. . .
<employee xmlns="http://www.bogus.com/employee/1.0"/>
<p: xmlns:p="urn:xmlns:bogus:partner1.0"/>
. . .
注意到这两个名称空间声明在指定的 URI 类型上的区别吗?实际上,<partner> 元素包括一个定义且包含一个前缀(在这个例子中为 p)的名称空间。名称空间前缀的使用是可选的,但是这更像是一种风格上的选择。如果一个元素有名称空间前缀,那么它就属于为前缀定义的名称空间;但是,它的子元素除非也加前缀,否则不属于这个名称空间。包含名称空间声明但没有名称空间前缀的元素(例如前一个例子中的 <employee> 元素)属于被声明的名称空间。而它们的子元素除非特别覆盖名称空间,否则也属于这个名称空间。最后,如果无前缀的元素没有显式的名称空间声明,那么将被绑定到作用域内的默认名称空间。如果没有那样的绑定,那么该元素就不属于任何名称空间。
来源:ibm.com 作者:C. M. Saracco 责编:豆豆技术应用