技术开发 频道

在Java中使用XQuery:SOA中操作数据的非常好的方法



二、XQuery API for Java (XQJ)简介
 
XQJ其实就是用Java实现的一个包,其中包含了很多的接口和类。使用XQJ可以查询单独的XML文档或XML文档集合。而XQuery提供了更灵活的机制:可以根据需要选择实现这些特性的方法。这就意味着可以使用XQJ来区分处理中间结果和最终结果。现在实现XQJ主要有两个框架,它们是Qexo和Saxon。其中Saxon可以同时在Java和.NET中使用,分别对应了两个包:Saxon-B和Saxon-SA。其中Saxon-B是以开源许可证形式发布的,而Saxon-SA则是收费的。
   
    XQJ
可以从JNDI中获得数据,也可以使用其他的方法获得数据。如XQDataSource可以作为创建XQuery连接对象、序列对象和项目对象的工厂。XQDataSource方法有三个重载的getConnection方法,方法的定义如下:
public XQConnection getConnection() throws XQException public XQConnection getConnection (String username, String passwd) throws XQException public XQConnection getConnection(Connection con) throws XQException
    在最后一个重载形式中可以使用已经存在的JDBC连接(这个连接的数据源是XML)来创建XQConnection对象。除非这个XQJ实现不支持这个重载形式,否则XQConnection和JDBC将使用同一个事务上下文。一但获得一个XQConnection对象,我们就可以调用prepareExpression方法来提交一个查询了。XQPreparedExpression类有一个executeQuery方法,通过这个方法,可以返回一个XQSequence对象。这个XQSequence对象包含了对于操作返回结果记录的游标。在移动到相应的位置后,可以使用getItem方法得到当前位置的数据。getItem方法返回了一个XQItem对象,通过XQItem类的相应方法,可以将返回数据转换为相应的Java数据类型。
 
    Saxon是XQJ的主要实现,在使用Saxon时,必须直接创建SaxonXQDataSource对象。而不是用工厂类来创建对象。因此,应用程序不能在动态创建XQDataSource时在编译时引用Saxon XQJ实现。如下面是创建SaxonXQDataSoruce的代码:
String content = null; XQDataSource ds = new SaxonXQDataSource(); XQConnection conn = ds.getConnection(); XQPreparedExpression exp = conn.prepareExpression("doc(\"books.xml\")/BOOKLIST/BOOKS/ITEM/TITLE"); XQResultSequence result = exp.executeQuery(); while (result.next()) { content = result.getItemAsString(); }
0