用saxon框架对xml数据进行过滤 - 程序员的天堂 - ITeye技术网站
Saxon 是一个 XSLT 和XQuery处理器。它是使用 XML 文档和样式表作为输入,然后生成结果文档作为输出的程序,它还包括了一个串行化器,用于将结果树转换成 XML、HTML 或纯文本。
Saxon8以上版本主要组成有:XSLT 2.0处理器、 XPath 2.0处理器、 XQuery 1.0处理器、XML Schema 1.0处理器。
XPath 教程: http://www.w3school.com.cn/xpath/index.asp
XQuery 教程:http://www.w3school.com.cn/xquery/index.asp
以下范例代码在saxonb9-1-0-8j包下测试通过:
1、xml文档内容
- <?xml version="1.0" encoding="UTF-8"?>
- <flight>
- <row flightno="CA3411" airline_code="CA" airline_namecn="中国国际航空公司" airline_nameen="Air China" city_code="SHA" city_namecn="上海虹桥" city_nameen="Shanghai" flight_date="20130202" flight_time="2200" status_code="cancel" status_namecn="取消" status_nameen="Cancel" checkin_counter="M2-3" gate="A118"/>
- <row flightno="CA3411" airline_code="CA" airline_namecn="中国国际航空公司" airline_nameen="Air China" city_code="SHA" city_namecn="上海虹桥" city_nameen="Shanghai" flight_date="20130202" flight_time="2300" status_code="fly" status_namecn="起飞" status_nameen="Fly" checkin_counter="M2-3" gate="A118"/>
- <row flightno="CZ3412" airline_code="CZ" airline_namecn="中国南方航空公司" airline_nameen="South Air" city_code="PEK" city_namecn="北京" city_nameen="Beijing" flight_date="20130203" flight_time="2200" status_code="fly" status_namecn="起飞" status_nameen="Fly" checkin_counter="M1-3" gate="A218"/>
- </flight>
<?xml version="1.0" encoding="UTF-8"?><flight> <row flightno="CA3411" airline_code="CA" airline_namecn="中国国际航空公司" airline_nameen="Air China" city_code="SHA" city_namecn="上海虹桥" city_nameen="Shanghai" flight_date="20130202" flight_time="2200" status_code="cancel" status_namecn="取消" status_nameen="Cancel" checkin_counter="M2-3" gate="A118"/> <row flightno="CA3411" airline_code="CA" airline_namecn="中国国际航空公司" airline_nameen="Air China" city_code="SHA" city_namecn="上海虹桥" city_nameen="Shanghai" flight_date="20130202" flight_time="2300" status_code="fly" status_namecn="起飞" status_nameen="Fly" checkin_counter="M2-3" gate="A118"/> <row flightno="CZ3412" airline_code="CZ" airline_namecn="中国南方航空公司" airline_nameen="South Air" city_code="PEK" city_namecn="北京" city_nameen="Beijing" flight_date="20130203" flight_time="2200" status_code="fly" status_namecn="起飞" status_nameen="Fly" checkin_counter="M1-3" gate="A218"/></flight>
2、java源码
- public class Test2 {
- public static void main(String[] args) {
- try{
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = builderFactory.newDocumentBuilder();
- //从文档中加载xml内容
- InputStream in = Class.class.getResourceAsStream("/flight/flight_data.xml");
- Document document = builder.parse(in);
- document.normalize(); //去掉XML文档中空白部分
- //从字符串中加载xml内容
- //StringReader sr = new StringReader("<flight><row flightno=\"CA3411\" airline_code=\"CA\" airline_namecn=\"中国国际航空公司\" airline_nameen=\"Air China\" city_code=\"SHA\" city_namecn=\"上海虹桥\" city_nameen=\"Shanghai\" flight_date=\"20130202\" flight_time=\"2300\" status_code=\"fly\" status_namecn=\"起飞\" status_nameen=\"Fly\" checkin_counter=\"M2-3\" gate=\"A118\"/></flight>");
- //InputSource is = new InputSource(sr);
- //Document document = builder.parse(is);
- //document.normalize(); //去掉XML文档中空白部分
- //xQuery表达式
- StringBuffer sb = new StringBuffer();
- sb.append(" for $s in /flight/row where 1=1 ");
- sb.append(" and contains(upper-case($s/@flightno), 'CA') ");
- sb.append(" and contains(upper-case($s/@city_namecn), '海') ");
- sb.append(" and upper-case($s/@airline_code)='CA' ");
- sb.append(" and $s/@flight_date='20130202' ");
- sb.append(" and $s/@flight_time>='2300' ");
- sb.append(" and $s/@flight_time<='2300' ");
- sb.append(" and $s/@status_code='fly' ");
- sb.append(" return $s ");
- Configuration configuration = new Configuration();
- //静态查询上下文
- StaticQueryContext context = new StaticQueryContext(configuration);
- XQueryExpression expression = context.compileQuery(sb.toString());
- //动态查询上下文
- DynamicQueryContext context2 = new DynamicQueryContext(configuration);
- context2.setContextItem(new DocumentWrapper(document, null, configuration));
- Properties props = new Properties();
- props.setProperty(OutputKeys.METHOD, "xml");
- props.setProperty(OutputKeys.INDENT, "yes");
- props.setProperty(OutputKeys.ENCODING, "GBK");
- props.setProperty(OutputKeys.VERSION, "1.0");
- //根据xQuery表达式解析xml文件,返回符合条件的数据,存储到writer对象
- Writer writer = new StringWriter();
- expression.run(context2, new StreamResult(writer), props);
- System.out.println(writer.toString());
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- }
public class Test2 { public static void main(String[] args) { try{ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); //从文档中加载xml内容 InputStream in = Class.class.getResourceAsStream("/flight/flight_data.xml"); Document document = builder.parse(in); document.normalize(); //去掉XML文档中空白部分 //从字符串中加载xml内容 //StringReader sr = new StringReader("<flight><row flightno=\"CA3411\" airline_code=\"CA\" airline_namecn=\"中国国际航空公司\" airline_nameen=\"Air China\" city_code=\"SHA\" city_namecn=\"上海虹桥\" city_nameen=\"Shanghai\" flight_date=\"20130202\" flight_time=\"2300\" status_code=\"fly\" status_namecn=\"起飞\" status_nameen=\"Fly\" checkin_counter=\"M2-3\" gate=\"A118\"/></flight>"); //InputSource is = new InputSource(sr); //Document document = builder.parse(is); //document.normalize(); //去掉XML文档中空白部分 //xQuery表达式 StringBuffer sb = new StringBuffer(); sb.append(" for $s in /flight/row where 1=1 "); sb.append(" and contains(upper-case($s/@flightno), 'CA') "); sb.append(" and contains(upper-case($s/@city_namecn), '海') "); sb.append(" and upper-case($s/@airline_code)='CA' "); sb.append(" and $s/@flight_date='20130202' "); sb.append(" and $s/@flight_time>='2300' "); sb.append(" and $s/@flight_time<='2300' "); sb.append(" and $s/@status_code='fly' "); sb.append(" return $s "); Configuration configuration = new Configuration(); //静态查询上下文 StaticQueryContext context = new StaticQueryContext(configuration); XQueryExpression expression = context.compileQuery(sb.toString()); //动态查询上下文 DynamicQueryContext context2 = new DynamicQueryContext(configuration); context2.setContextItem(new DocumentWrapper(document, null, configuration)); Properties props = new Properties(); props.setProperty(OutputKeys.METHOD, "xml"); props.setProperty(OutputKeys.INDENT, "yes"); props.setProperty(OutputKeys.ENCODING, "GBK"); props.setProperty(OutputKeys.VERSION, "1.0"); //根据xQuery表达式解析xml文件,返回符合条件的数据,存储到writer对象 Writer writer = new StringWriter(); expression.run(context2, new StreamResult(writer), props); System.out.println(writer.toString()); }catch(Exception ex){ ex.printStackTrace(); } }}
3、输出结果
- <?xml version="1.0" encoding="GBK"?>
- <row airline_code="CA" airline_namecn="中国国际航空公司" airline_nameen="Air China"
- checkin_counter="M2-3"
- city_code="SHA"
- city_namecn="上海虹桥"
- city_nameen="Shanghai"
- flight_date="20130202"
- flight_time="2300"
- flightno="CA3411"
- gate="A118"
- status_code="fly"
- status_namecn="起飞"
- status_nameen="Fly"/>
<?xml version="1.0" encoding="GBK"?><row airline_code="CA" airline_namecn="中国国际航空公司" airline_nameen="Air China" checkin_counter="M2-3" city_code="SHA" city_namecn="上海虹桥" city_nameen="Shanghai" flight_date="20130202" flight_time="2300" flightno="CA3411" gate="A118" status_code="fly" status_namecn="起飞" status_nameen="Fly"/>
用saxon框架对xml数据进行过滤 - 程序员的天堂 - ITeye技术网站的更多相关文章
- 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站
总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站 极分享:高质分享+专业互助=没有难做的软件+没有不得已的加班 极分享:高质分享+专业互助=没有 ...
- MyBatis框架的XML数据访问Dao层接口的组合使用
MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...
- 一个必用的javascript框架:underscore.js - wine的思考 - ITeye技术网站
AngularJS+JqueryMobile+PhoneGap 打造APP « Dogeek AngularJS+JqueryMobile+PhoneGap 打造APP
- 苦B程序员的数据验证之路
发生了什么事 在一次苦B程序员和苦C程序员的结对编程中发生的一段对话 代码是这样的: public void deleteAllExtendAclsFromContent(String content ...
- spring 框架的xml文件如何读取properties文件数据
spring 框架的xml文件如何读取properties文件数据 第一步:在spring配置文件中 注意:value可以多配置几个properties文件 <bean id="pro ...
- 记录SSM框架项目迁移SpringBoot框架-----pom.xml的迁移
第一步:迁移pom.xml文件(去除spring相关的依赖) SSM中的pom: <project xmlns="http://maven.apache.org/POM/4.0.0&q ...
- 一个简单xml数据转换为数组的方法
本人用easywechat做微信回复图文,从数据库中拿到的数据直接是xml拼好的数据,但是框架只有自带的获取xml格式的语句,所有需要将xml数据中所需要的数据拿出来用来拼接. 搜了好多资料说的都很麻 ...
- iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)
一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...
- XML 数据请求与JSON 数据请求
(1)XML 数据请求 使用 AFNetworking 中的 AFHTTPRequestOperation 和 AFXMLParserResponseSerializer,另外结合第三方框架 XMLD ...
随机推荐
- Mac上安装Tomcat
参考文档:http://blog.csdn.net/j2ee_me/article/details/7928493 0.如果java没有被初始安装,所以你要自己去找Apple的安装程序这里来安装,或者 ...
- Eclipse下配置和使用Hibernate Tools
本文转自:http://radiumwong.iteye.com/blog/358585 Hibernate Tools可以通过访问已经建立好的数据库以反向工程方式生成POJO文件. 今天就来说一下如 ...
- 使用HAXM加速Android虚拟机
Android虚拟机在支持Intel VT技术的CPU上,可以使用HAXM(Hardware Accelerated Execution Manager)得到硬件加速支持,使得虚拟机运行速度得到极大提 ...
- libc.so.6重做链接,删除导致的缺失问题(后期需要深入研究),未能成功升级
中间件启动,提示/lib64/libc.so.6版本过低,升级glibc后,修改临时环境变量,结果导致sgment fault错误,根据报错 ll /lib64/ |grep libc -rwxr-x ...
- Python -- lambda, map, filter
lambda f = lambda x : x * 2 f(5) f = lambda x,y,z : x+y+z f(2,1,3) map list(map(lambda x:x[0].upper( ...
- Light OJ 1008
找规律. 首先令n=sqrt(s),上取整.讨论当n为偶数时,若n*n-s<n则x=n,y=n*n-s+1否则x=-n*n+2*n+s-1,y=n;如果n为奇数,交换x,y即可,对称的. Sam ...
- DHCP详细工作过程(转)
DHCP客户端通过和DHCP服务器的交互通讯以获得IP地址租约.为了从DHCP服务器获得一个IP地址,在标准情况下DHCP客户端和DHCP服务器之间会进行四次通讯.DHCP协议通讯使用端口UDP 67 ...
- 批量文件重命名工具-极力推荐 advanced renamer
http://www.advancedrenamer.com/ 功能太强大了,自己慢慢探索吧.
- VC与ADO数据库操作
VC与ADO数据库操作 学研部的同志们,大家好! 想开一次学习会,实习时间冲突了,只好把文档发给大家看了.重点推荐李振龙的BMP读图教程! 尤其是大三GIS班的同志,注意了,可能实习用得上的! 一.A ...
- linux 命令实现原理
我们知道有些Linux的命令涉及到一些高效率的算法,在此做出一个积累吧,不是系统的. 1.tail命令打印一个文件的最后num行 2.grep命令从文本中匹配字符串 基于正则表达式的匹配很快. it ...