当前位置:编程学习 > JAVA >>

java使用xquery

在使用关系数据库时,我们通过sql语句来检索数据源,这没有任何问题,但是关系数据也存在着一定的局限性,只能存储结构化的数据
当数据集是非结构化的时候该怎样存储呢,最简单的办法就是封装成xml。
应用开发中我们经常使用xml作为数据源来存储一些非结构化的数据,然而是否存在一种语言可以像sql语句检索关系数据库一样来检索xml呢?答案就是xquery。
 
xquery本身的语法结构并不复杂,xml节点位置是通过xpath进行描述的,在辅以相应的逻辑表达式,满足用户的检索偏好设置。www.zzzyk.com
有关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/@易做图='男') 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
使用大致如下:
[java] view plaincopy
//首先获取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()));
 
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,