XQuery和XML数据库
XQuery文档可用于查询XML数据库(XML DB)。目前,仅IBM DB2数据库支持XQuery功能。使用XQuery查询XML DB的机制主要包括:(i) 向XQuery引擎指示要查询DB中的XML,而不是XML文档中的XML;(ii) 访问DB中的XML数据。
下方详细介绍了该机制的实现步骤:
1.在文档开头插入XQUERY关键词,设置XQuery文档以查询XML DB。
2.对于活动的XQuery文档,启用DB支持 (通过信息窗口)并连接到DB(使用“快速连接”对话框)。
3.在XQuery文档中,插入DB特定的XQuery扩展以访问DB数据并使其可用于XQuery操作。
4.在XMLSpy中执行Xquery文档。
设置XQuery文档以查询XML DB
要设置XQuery文档以查询XML DB,请打开XQuery文档(或新建XQuery文档),然后在文档开头(prolog之前)输入关键词XQUERY(大小写无关);参见下方示例。
XQUERY (: Retrieve details of all customers :)
declare default element namespace "https://www.altova.com/xquery/databases/db2";
<a> {db2-fn:xmlcolumn("CUSTOMER.INFO")} </a>
如果该文档使用了可选的xquery version表达式,则仍需要使用XQUERY关键词:
XQUERY xquery version "1.0"; (: Retrieve details of all customers :)
declare default element namespace "http://https://www.altova.com/xquery/databases/db2";
<a> {db2-fn:xmlcolumn("CUSTOMER.INFO")} </a>
提示: | XMLSpy的内置XQuery引擎将XQUERY关键词理解为表示要访问一个XML数据库。因此,试图在任何XML文档上执行包含XQUERY关键词的XQuery文档,而不是包含在XML DB中的文档,将导致错误。 |
为XQuery启用DB支持和连接到DB
要启用对XQuery文档的DB支持,请在信息窗口中选中“启用数据库支持”复选框(参见下方截图)。请注意,DB支持必须为每个XQuery文档单独启用,并且每次重新打开XQuery文档时都要启用。
当您在信息窗口中启用DB支持时,将弹出一个“快速连接”对话框,使您能够连接到数据库。目前,仅支持IBM DB2。有关如何连接到DB,请参见连接到数据库部分。如果存在到数据源的连接,它们将列在信息窗口的的“数据源”组合框中(参见下方截图),并且可以选择其中一个数据源作为活动XQuery文档的数据源。在信息窗口中,您还可以从“根对象”组合框中的可用对象中选择一个根对象。
可以通过单击信息窗口中的图标随时访问“快速连接”对话框(使您能够连接到DB)。
提示: | 当您关闭XQuery文档时,与DB的连接也会被关闭。如果您随后重新打开XQuery文档,您还必须重新连接到DB。 |
IBM DB2特定的XQuery语言扩展
两个IBM DB2特定的函数可用于XQuery文档,以在IBM DB2数据库中检索数据:
•db2-fn:xmlcolumn将检索整个XML列,而不搜索或过滤该列。
•db2-fn:sqlquery将基于SQL SELECT语句检索值。
使用这些函数检索的XML数据可以使用标准的XQuery构造函数进行操作。参见下方示例。
db2-fn:xmlcolumn: 该函数的参数是一个区分大小写的字符串,用于标识一个表格中的XML列。字符串参数必须是一个XML类型的限定列名。该函数在不应用搜索条件的情况下返回列中的所有XML数据,作为一个序列。在以下示例中,CUSTOMER表格的INFO (XML) 列的所有数据都在顶级<newdocelement>元素内返回:
XQUERY (: Retrieve details of all customers :)
declare default element namespace "https://www.altova.com/xquery/databases/db2";
<newdocelement> {db2-fn:xmlcolumn("CUSTOMER.INFO")} </newdocelement>
检索到的数据可以使用XQuery构造函数进行查询。在下方示例中,使用了一个XQuery构造函数对从CUSTOMER表格的INFO (XML)列检索到的XML数据进行过滤,以便仅检索来自多伦多的客户的个人资料。
XQUERY (: Retrieve details of Toronto customers :)
declare default element namespace "https://www.altova.com/xquery/databases/db2";
<newdocelement> {db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo[addr/city='Toronto']} </newdocelement>
请注意: | 在上方示例中,每个单元格中XML文件的文档元素是customerinfo,由db2-fn:xmlcolumn返回的XML序列的根节点被认为是在customerinfo节点上方的抽象节点。 |
db2-fn:sqlquery: 该函数将SQL Select语句作为其参数,并返回一个由XML值组成的序列。检索到的序列可以使用XQuery构造函数进行查询。在下面的示例中,在CUSTOMER表格的INFO列中过滤出CID字段中的值在1000和1004之间的记录。请注意,虽然SQL不需要区分大小写,但XQuery需要。
XQUERY (: Retrieve details of customers by Cid:)
declare default element namespace "https://www.altova.com/xquery/databases/db2";
<persons>
{db2-fn:sqlquery("SELECT info FROM customer WHERE CID>1000 AND CID<1004")/
<person>
<id>{data(@Cid)}</id>
<name>{data(name)}</name>
</person>}
</persons>
上方的XQuery文档返回以下输出:
<persons xmlns="https://www.altova.com/xquery/databases/db2">
<person>
<id>1001</id>
<name>Kathy Smith</name>
</person>
<person>
<id>1002</id>
<name>Jim Jones</name>
</person>
<person>
<id>1003</id>
<name>Robert Shoemaker</name>
</person>
</persons>
请注意以下几点:
•Prolog中的默认元素命名空间声明应用于整个XQuery文档,用于XML文档的导航以及新元素的构造。这意味着XQuery选择器name已被扩展为<default-element-namespace>:name,并且构造的元素,如persons位于默认元素命名空间中。
•SQL Select语句不区分大小写。
•Select语句的WHERE子句应该引用另一个数据库项,而不是正在访问的XML文件中的节点。
•db2-fn:sqlquery函数之后的“/”代表返回的序列的第一个项,而该项是用于进一步导航的上下文节点。
执行XQuery
要执行XQuery文档,请选择XQuery执行命令(XSL/XQuery菜单)。或者,按Alt+F10或单击“XQuery执行”图标。执行的结果将显示在一个新文档中。