java使用xquery
2013-03-04 11:11
489 查看
在使用关系数据库时,我们通过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
使用大致如下:
另外:
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()));
当数据集是非结构化的时候该怎样存储呢,最简单的办法就是封装成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()));
相关文章推荐
- 如何在java程序中使用Xquery----datadirectxquery
- 如何在java程序中使用Xquery----datadirectxquery.jar
- Java环境中使用Xquery去分析XML文档
- java中使用xQuery
- 【Java】【反射】 使用反射方式去实现一个接口
- 在Lotus Domino中使用Java构建应用程序
- zabbix使用zabbix_java_gateway 监控java应用进程 主动模式 python脚本
- [Java]使用爬虫来获取知乎的推荐内容标题
- 【转载】使用JAVA在TOMCAT下实现计划任务监听器
- java中把字符串类型转换为int型,不允许使用java内置方法,如parseInt等
- <转>java编译问题:使用了未经检查或不安全的操作
- Java synchronized的使用
- 第2章 Java编程基础——FAQ2.22 创建String对象时, 使用String s=new String (“abc”)和String s=“abc”语句有什么区别?
- 如何使用java调用DLL运行C++(初篇)
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
- JAVA中其它包中无法引用缺省包(default package)的类 - 使用反射可以
- eclispe中的maven项目使用spring报java.lang.ClassNotFoundException: org.springframework.web.c
- JAVA使用Socket实现多人通讯以及文件传输
- 使用JAVA中的动态代理实现数据库连接池
- java之Spring简单使用