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文档内容

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <flight>  
  3.     <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"/>  
  4.     <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"/>  
  5.     <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"/>  
  6. </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源码

  1. public class Test2 {  
  2.     public static void main(String[] args) {  
  3.         try{  
  4.             DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();  
  5.             DocumentBuilder builder = builderFactory.newDocumentBuilder();  
  6.               
  7.             //从文档中加载xml内容  
  8.             InputStream in = Class.class.getResourceAsStream("/flight/flight_data.xml");  
  9.             Document document = builder.parse(in);  
  10.             document.normalize(); //去掉XML文档中空白部分  
  11.               
  12.             //从字符串中加载xml内容  
  13.             //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>");  
  14.             //InputSource is = new InputSource(sr);  
  15.             //Document document = builder.parse(is);  
  16.             //document.normalize(); //去掉XML文档中空白部分  
  17.               
  18.             //xQuery表达式  
  19.             StringBuffer sb = new StringBuffer();  
  20.             sb.append(" for $s in /flight/row where 1=1 ");  
  21.             sb.append(" and contains(upper-case($s/@flightno), 'CA') ");  
  22.             sb.append(" and contains(upper-case($s/@city_namecn), '海') ");  
  23.             sb.append(" and upper-case($s/@airline_code)='CA' ");  
  24.             sb.append(" and $s/@flight_date='20130202' ");  
  25.             sb.append(" and $s/@flight_time>='2300' ");  
  26.             sb.append(" and $s/@flight_time<='2300' ");  
  27.             sb.append(" and $s/@status_code='fly' ");  
  28.             sb.append(" return $s ");  
  29.               
  30.             Configuration configuration = new Configuration();  
  31.               
  32.             //静态查询上下文  
  33.             StaticQueryContext context = new StaticQueryContext(configuration);  
  34.             XQueryExpression expression = context.compileQuery(sb.toString());  
  35.               
  36.             //动态查询上下文  
  37.             DynamicQueryContext context2 = new DynamicQueryContext(configuration);    
  38.             context2.setContextItem(new DocumentWrapper(document, null, configuration));  
  39.               
  40.             Properties props = new Properties();  
  41.             props.setProperty(OutputKeys.METHOD, "xml");  
  42.             props.setProperty(OutputKeys.INDENT, "yes");  
  43.             props.setProperty(OutputKeys.ENCODING, "GBK");  
  44.             props.setProperty(OutputKeys.VERSION, "1.0");  
  45.               
  46.             //根据xQuery表达式解析xml文件,返回符合条件的数据,存储到writer对象  
  47.             Writer writer = new StringWriter();  
  48.             expression.run(context2, new StreamResult(writer), props);  
  49.               
  50.             System.out.println(writer.toString());  
  51.               
  52.         }catch(Exception ex){  
  53.             ex.printStackTrace();  
  54.         }  
  55.     }  
  56. }  
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、输出结果

  1. <?xml version="1.0" encoding="GBK"?>  
  2. <row airline_code="CA" airline_namecn="中国国际航空公司" airline_nameen="Air China"  
  3.      checkin_counter="M2-3"  
  4.      city_code="SHA"  
  5.      city_namecn="上海虹桥"  
  6.      city_nameen="Shanghai"  
  7.      flight_date="20130202"  
  8.      flight_time="2300"  
  9.      flightno="CA3411"  
  10.      gate="A118"  
  11.      status_code="fly"  
  12.      status_namecn="起飞"  
  13.      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技术网站的更多相关文章

  1. 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站

    总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站 极分享:高质分享+专业互助=没有难做的软件+没有不得已的加班 极分享:高质分享+专业互助=没有 ...

  2. MyBatis框架的XML数据访问Dao层接口的组合使用

    MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...

  3. 一个必用的javascript框架:underscore.js - wine的思考 - ITeye技术网站

    AngularJS+JqueryMobile+PhoneGap 打造APP « Dogeek AngularJS+JqueryMobile+PhoneGap 打造APP

  4. 苦B程序员的数据验证之路

    发生了什么事 在一次苦B程序员和苦C程序员的结对编程中发生的一段对话 代码是这样的: public void deleteAllExtendAclsFromContent(String content ...

  5. spring 框架的xml文件如何读取properties文件数据

    spring 框架的xml文件如何读取properties文件数据 第一步:在spring配置文件中 注意:value可以多配置几个properties文件 <bean id="pro ...

  6. 记录SSM框架项目迁移SpringBoot框架-----pom.xml的迁移

    第一步:迁移pom.xml文件(去除spring相关的依赖) SSM中的pom: <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  7. 一个简单xml数据转换为数组的方法

    本人用easywechat做微信回复图文,从数据库中拿到的数据直接是xml拼好的数据,但是框架只有自带的获取xml格式的语句,所有需要将xml数据中所需要的数据拿出来用来拼接. 搜了好多资料说的都很麻 ...

  8. iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)

    一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...

  9. XML 数据请求与JSON 数据请求

    (1)XML 数据请求 使用 AFNetworking 中的 AFHTTPRequestOperation 和 AFXMLParserResponseSerializer,另外结合第三方框架 XMLD ...

随机推荐

  1. 扫描局域网内的ip和主机名

    1. 目的 今天发现我配置的一台电脑ip被人占用了,所以准备写个程序扫描一下局域网内所有正在使用的ip和主机名 2. 实现--直接上代码 import time import threading im ...

  2. Alert()与Redirect()同时使用失效的问题

    例如以下代码: echo "<script>alert('跳转到博客园');</script>"; redirect(“www.cnblogs.com”); ...

  3. strncasecmp与strcasecmp用法

    strcasecmp strcasecmp(忽略大小写比较字符串) 相关函数 bcmp,memcmp,strcmp,strcoll,strncmp 表头文件 #include<string.h& ...

  4. Element type "bean" must be followed by either attribute specifications, ">" or "/>".

    在这里其他内容就省了,错在,<bean id="bpcsU1gblDAO"class="dao.jk.bpcs.impl.BpcsU1gblDaoImpl" ...

  5. Java成员变量默认值

    Java中明确规定:1.如果是引用型的,比如:String,还有类对象,他们的默认值都是:null:2.而如果是值类型:double,int,long,float,char等等,他们都是:0:还有一个 ...

  6. HDU 4635 Strongly connected(强连通分量缩点+数学思想)

    题意:给出一个图,如果这个图一开始就不是强连通图,求出最多加多少条边使这个图还能保持非强连通图的性质. 思路:不难想到缩点转化为完全图,然后找把它变成非强连通图需要去掉多少条边,但是应该怎么处理呢…… ...

  7. ElasticSearch — 集群搭建

    1.es需要java环境,故先检查java环境是否正常 2.下载elasticsearch安装包 http://www.elasticsearch.org/download/ 目前最新版本到1.4.0 ...

  8. 【Qt开发】修改源码文件的编码格式的小技巧 .

    默认情况下,代码文件应该以utf-8的格式来存储的.而如果在代码文件的转移或者上传下载过程中,弄乱了文件的编码格式,一般会出现乱码的情况. 例如windows系统下,中文就很容易出现乱码,如下图,文件 ...

  9. MaterialEditText 控件学习

    这个视图原始框架地址:https://github.com/rengwuxian/MaterialEditText 指导手册:http://www.rengwuxian.com/post/materi ...

  10. PAT (Advanced Level) 1115. Counting Nodes in a BST (30)

    简单题.统计一下即可. #include<cstdio> #include<cstring> #include<cmath> #include<vector& ...