用saxon框架对xml数据进行过滤 - 程序员的天堂 - ITeye技术网站
2014-03-19 17:34
579 查看
用saxon框架对xml数据进行过滤
博客分类: JavaSaxon 是一个 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代码
<?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源码
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代码
<?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"/>
来自为知笔记(Wiz)
相关文章推荐
- 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站
- java对xml进行的DOM 解析以及如何对网站数据进行加密
- caoruntao的博客 - 数据结构及算法分类文章列表 - ITeye技术网站
- 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站
- XML 与 Java 技术: 用 Castor 进行数据绑定
- XML 与 Java 技术: 用 Castor 进行数据绑定
- XML 与 Java 技术: 用 Castor 进行数据绑定
- 一个必用的javascript框架:underscore.js - wine的思考 - ITeye技术网站
- XML 与 Java 技术: 用 Castor 进行数据绑定
- Android根据分辨率进行单位转换-(dp,sp转像素px) - topMan'blog - ITeye技术网站
- 一个必用的javascript框架:underscore.js - wine的思考 - ITeye技术网站
- 谈谈对程序员的培养 - 四火的BLOG - ITeye技术网站
- Maven简介(一)——Maven的安装和settings.xml的配置 - 好好学习,天天向上 - ITeye技术网站
- XML 与 Java 技术: 用 Castor 进行数据绑定
- XML 与 Java 技术: 用 Castor 进行数据绑定
- 程序员怎么获取股票实时数据,并进行技术指标分析呢?
- XML 与 Java 技术: 用 Castor 进行数据绑定
- 网站运维技术与实践之数据采集、传输与过滤
- Thinkphp框架下对某个字段查询数据的时候进行唯一过滤,返回唯一不同的值
- hudson--部署设置 - Spring——Java程序员的春天 - ITeye技术网站