日期:2014-05-16  浏览次数:20404 次

java使用xquery
在使用关系数据库时,我们通过sql语句来检索数据源,这没有任何问题,但是关系数据也存在着一定的局限性,只能存储结构化的数据
当数据集是非结构化的时候该怎样存储呢,最简单的办法就是封装成xml。
应用开发中我们经常使用xml作为数据源来存储一些非结构化的数据,然而是否存在一种语言可以像sql语句检索关系数据库一样来检索xml呢?答案就是xquery。

xquery本身的语法结构并不复杂,xml节点位置是通过xpath进行描述的,在辅以相应的逻辑表达式,满足用户的检索偏好设置。
有关xquery和xpath的教程可参考如下网址
http://www.w3school.com.cn/xpath/index.asp
http://www.w3school.com.cn/xquery/index.asp
几个比较基础的语法信息如下:
xpath中通过'/'来表示节点层级结构,'//'表示所有节点
节点过滤条件写在'[ ]'里
节点属性加@符
//person[@name='zhangsan']/password 表示获取姓名为zhangsan的用户密码
对应的xml结构是这样的<root><person name="zhangsan"><password>mima</password></person> person...</root>

xquery中
where语句用来指定过滤条件
return语句用来设置返回的结果集
for语句用来执行遍历
where和return子句里都可以加if/else条件判断逻辑
几个比较常用的功能函数:
    data(element):返回节点的text
    contains(element,value):查询模糊匹配
    doc(filePath):加载xml数据文件
如:
for $x in doc("persons.xml")//person
where $x/@age > 20 and contains($x/@name,'张')
return if($x/@sex='男') then data($x/password) else ()

表示:
查询姓张并且年龄大于20的人,如果是男性返回密码,如果是女性返回空

javaAPI使用
这里主要使用saxon来执行xquery,具体应用可参考如下网址:
http://www.cs.duke.edu/courses/fall08/cps116/docs/saxon/samples/java/XQJExamples.java
saxon的jar包可到这里下载:
http://download.csdn.net/detail/javaman_chen/5107221
使用大致如下:
//首先获取xml的数据源连接
XQDataSource ds = new SaxonXQDataSource();
XQConnection conn = ds.getConnection();
//通过XQExpression执行xquery
XQExpression expression = conn.createExpression();
XQResultSequence res=expression.executeQuery("doc(persons.xml)//person....");
//处理结果集
while(res.next()){
    res.getObject();
}

另外:
xquery的doc()函数需要传递xml的文档路径,然而在开发时,我们的xml数据源可能还没有生成文件,对此,XQExpression提供了API,可以直接绑定xml数据而不用加载xml文档
expression.bindNode(XQConstants.CONTEXT_ITEM, org.w3c.dom.Document doc, null);
doc对象可通过DocumentBuilder类生成
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc=db.parse(new ByteArrayInputStream("<person>zhangsan</person>".getBytes()));