查询包含名称空间的XML数据
http://tech.ddvip.com 2007年07月03日 社区交流
内容摘要:如果想学习关于 XQuery 与 SQL/XML 的基础以外的更多知识,那么必须理解文档和消息中的 XML 名称空间对查询的语义的影响。否则,就可能收到意外的结果。幸运的是,学习如何查询包含名称空间的 XML 文档并不难。本文提供了一些例子来帮助您起步。
结果中不包括关于 Acme Tech 的信息,因为它的 <company> 元素不属于被声明的名称空间。
清单 14 展示了用 SQL/XML 表达上述查询的一种方式:
清单 14. 含默认名称空间的 SQL/XML 查询select xmlquery('declare default element namespace
"urn:xmlns:saracco-sample:company1.0";
$c/company' passing details as "c")
from partners
where xmlexists('declare default element namespace
"urn:xmlns:saracco-sample:company1.0";
$c/company' passing details as "c") %
XMLExists() 函数将结果限制为与指定名称空间相关联的四个公司记录。
案例 3:探索名称空间的大小写敏感性
考虑与 清单 12 中的例子非常相似的一个查询:
清单 15. 名称空间经过修改的 XQueryxquery declare default element namespace "urn:xmlns:saracco-sample:Company1.0";
db2-fn:xmlcolumn('PARTNERS.DETAILS')/company
仔细观察这个查询,其中只有一个字符与前面显示的 XQuery 不同。这个查询中,“Company1.0” 以一个大写字母开头,而前面查询在名称空间的定义中引用的是 “company1.0”。这条查询可以执行成功,但是不返回任何记录。这是因为名称空间和 XPath 表达式一样,是大小写敏感的。
如果查询能够执行,但是没有返回数据,那么请仔细检查查询中的路径表达式和名称空间声明。对于 XQuery 和 SQL/XML 都是如此。
案例 4:声明带前缀的名称空间
到现在为止,前面的例子都是为每个查询声明一个默认名称空间。实际上,也可以用前缀声明一个名称空间,需要的时候可在查询中引用该前缀。如果经常创建包含名称空间前缀的 XML 文档,那么这种方法对于您来说应该很自然了。而且,如果查询需要引用属于不同名称空间的 XML 元素,那么必须使用前缀,在本文的后面可以看到这一点。
来源:ibm.com 作者:C. M. Saracco 责编:豆豆技术应用