文档章节

sax解析

Jenly
 Jenly
发布于 2016/09/18 15:37
字数 878
阅读 0
收藏 0

前面说到了pull解析和dom解析、自然少不了sax解析、而在这里、我将sax解析写成接口、方便更具扩展性、


比如要处理类似格式的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<!-- 结果信息 -->
<result>
<resultCode>1</resultCode>
<resultMessage>结果信息</resultMessage>
</result>
<!-- 下面是xml数据 -->


结果信息实体类:

public class ResultInfo {
	
	private String resultCode;
	private String resultMessage="";
	
	public static final String RESULT_CODE_OK = "1";
	public static final String RESULT_CODE_ERROR = "0";
	
	//-------------------------------
	
	public ResultInfo(){
		
	}
	
	public ResultInfo(String resultCode,String resultMessage){
		
		this.resultCode = resultCode;
		this.resultMessage = resultMessage;
	}
	
	//-------------------------------
	
	public String getResultCode() {
		return resultCode;
	}

	public void setResultCode(String resultCode) {
		this.resultCode = resultCode;
	}

	public String getResultMessage() {
		return resultMessage;
	}

	public void setResultMessage(String resultMessage) {
		this.resultMessage = resultMessage;
	}
	
	//-------------------------------

	
	@Override
	public String toString() {
		return "resultInfo:["+resultCode+" "+resultMessage +"]";
	}

上面的resultCode也可以直接写成int类型的、只不过在下面需要转换下、


接着写一个抽象的 AbstractHandler去继承 DefaultHandler

public abstract class AbstractHandler extends DefaultHandler{
	
	protected final String CLAZZ = "AbstractHandler";

	//-----------------------------------------
	public static final String TAG_NAME_RESULT_INFO = "result";
	public static final String TAG_NAME_RESULT_CODE = "resultCode";
	public static final String TAG_NAME_RESULT_MESSAGE = "resultMessage";
	//-----------------------------------------
	
	private String tagName;
	private String content;
	
	private ResultInfo resultInfo;

	//-----------------------------------------
	
	public String getTagName() {
		return tagName;
	}
	public void setTagName(String tagName) {
		this.tagName = tagName;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public ResultInfo getResultInfo() {
		return resultInfo;
	}
	public void setResultInfo(ResultInfo resultInfo) {
		this.resultInfo = resultInfo;
	}
	//-----------------------------------------
	
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
	}
	//-----------------------------------------
	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
	}
	
	//-----------------------------------------
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		this.tagName = localName;
		
		if(TAG_NAME_RESULT_INFO.equalsIgnoreCase(localName)){
			resultInfo = new ResultInfo();
		}else if(TAG_NAME_PAGE_INFO.equalsIgnoreCase(localName)){
			pageInfo = new PageInfo();
		}else{
			startElements(uri, localName, qName, attributes);
		}
	}
	//-----------------------------------------
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		super.characters(ch, start, length);
		
		content = new String(ch,start,length);
			try{
				if(!TextUtils.isEmpty(content.trim())){
					if(TAG_NAME_RESULT_CODE.equalsIgnoreCase(tagName)){
						resultInfo.setResultCode(content);
					}else if(TAG_NAME_RESULT_MESSAGE.equalsIgnoreCase(tagName)){
						resultInfo.setResultMessage(content);
					}else{
						characterss(ch, start, length);
					}
				}
				LogUtils.logI(tagName+"\t-------\t"+content);
			}catch (NumberFormatException e) {
				LogUtils.logE(CLAZZ, "数字格式化错误!");
			}catch (Exception e) {
				LogUtils.logE(CLAZZ, e.getMessage());
				e.printStackTrace();
			}
	}
	
	
	//-----------------------------------------
	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		super.endElement(uri, localName, qName);
		
		endElements(uri, localName, qName);
	
	}
	
	
	//-----------------------------------------
	
	public abstract void startElements(String uri, String localName, String qName, Attributes attributes);
	
	public abstract void characterss(char[] ch, int start, int length);
	
	public abstract void endElements(String uri,String localName,String qName);
}

在这里之所以将AbstractHandler写成抽象类、就是为了更具有扩展性的去处理上面的xml标记的<!-- 下面是xml数据 -->这些可扩展的未知数据、


接着写个默认的ResultHandler继承AbstractHandler去实现抽象方法:

public class ResultHandler extends AbstractHandler{

	@Override
	public void startElements(String uri, String localName, String qName, Attributes attributes) {
		
	}

	@Override
	public void characterss(char[] ch, int start, int length) {
		
	}

	@Override
	public void endElements(String uri, String localName, String qName) {
		
	}

}

以上只是针对于上面风格的xml文件写了个处理器Handler、接着下面还需通过SAXParserFactory得到一个XMLReader、不过在这里、得先写个XmlParser接口


XmlParser接口:

public interface XmlParser {
	
	/**
	 * XML解析回调接口
	 */
	public interface XmlParserCallback{
		
		void onFinish();
		
		void onError(String error);
	}
	
	public void parse(InputSource inputSource);
	
	public void parse(String response);

}


然后写个XmlParserImpl实现XmlParser接口:

public class XmlParserImpl implements XmlParser{
	
	//-----------------------------------------
	
	private AbstractHandler handler;
	private XmlParserCallback callback;
	
	//-----------------------------------------
	
	public XmlParserImpl(AbstractHandler handler,XmlParserCallback callback){
		if(null!=handler){
			this.handler = handler;
		}else{
			this.handler = new ResultHandler();
		}
		this.callback = callback;
	}

	//-----------------------------------------
	
	@Override
	public void parse(String response){
		parse(new InputSource(new StringReader(response)));
	}
	
	@Override
	public void parse(InputSource inputSource) {
		
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			XMLReader xmlReader = factory.newSAXParser().getXMLReader();
			xmlReader.setContentHandler(handler);
			xmlReader.parse(inputSource);
			
			
			ResultInfo resultInfo = handler.getResultInfo();
			
			if(ResultInfo.RESULT_CODE_OK.equals(resultInfo.getResultCode())){
				callback.onFinish();
			}else{
				callback.onError("解析结果码:"+resultInfo.getResultCode()+"\n结果信息:"+resultInfo.getResultMessage());
			}
		}catch(Exception e){
			callback.onError("XML解析出错!");
			e.printStackTrace();
		}
	}

}

这样、其实一个可扩展性的sax解析就完成了、只要直接new一个XmlParserImpl就可以直接解析了、比如就解析那个默认的xml文件:

final ResultHandler resultHandler = new ResultHandler();
XmlParser xmlParser = new XmlParserImpl(resultHandler , new XmlParserCallback() {
	
	@Override
	public void onFinish() {
		//表示成功、结果码为1
		System.out.println(resultHandler.getResultInfo().toString());//结果信息

	}
	
	@Override
	public void onError(String error) {
		
		
	}
});
xmlParser.parse(xml);//xml以InputStream或String都行


若需扩展只要写个类去实现AbstractHandler、根据节点来解析扩展的数据即可、

ps:像这样半封装式的写个sax解析接口并实现它、总结一些共性的是不是很好呢、



本文转载自:http://blog.csdn.net/jenly121/article/details/9419815

Jenly

Jenly

粉丝 0
博文 35
码字总数 0
作品 0
深圳
私信 提问
Jaxp解析器_SAX解析方式

1、jaxp的sax解析方式的原理() 2、使用jaxp的sax方式解析xml(会写) ======================================= 1、jaxp的sax解析方式的原理() jaxp解析xml有两种技术 dom 和 sax dom方式...

Eric-Zhou
02/28
0
0
sax的解析原理基础

1:sax解析是什么? SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文...

逐梦的Man
2017/12/18
0
0
xml的2种解析方式(DOM和SAX解析方式)

1、xml的解析的简介(*) * dom和sax区别 ==================================================================== 1、xml的解析的简介(写到java代码)(今天最重要的内容**) * xml是标记型...

Eric-Zhou
02/28
0
0
Android中XML解析模块的使用方法

在音乐跟电视的项目中,很多都是使用了典型的按照接口规范的流程处理方式。 例如上图,客户端发送一个request请求,服务端就会以xml的数据格式返回一个response响应。但是在客户端界面展示x...

晨曦之光
2012/03/05
1K
2
Android 创建与解析XML(一)—— 概述

Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器、解析器、转换器 API,对 XML 进行解析和转换。 XML,相关有DOM、SAX、JDOM、DOM4J、Xerce...

长平狐
2013/01/06
159
0

没有更多内容

加载失败,请刷新页面

加载更多

Storm+Hbase广告实时统计

本文主要讲述使用Kafka+Strom+Hbase搭建的一套广告实时计算系统。其中服务器显示使用的是SpringBoot+Vue+ElementUI+EChats. 主要内容: 1.需求 2.日志格式 3.Hbase表格设计 4.编写Storm程序 ...

飓风2000
5分钟前
0
0
android,ContentProvider+ContentObserver+ContentResolver,用法。

这个是传智播客老师讲android开发时的一个图。 一、 PersonProvider继承ContentProvider,实现ContentProvider中的数据操作类。 ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起...

天王盖地虎626
11分钟前
0
0
解决markdown中的不换行问题

没有解决我的格式显示问题 https://blog.csdn.net/qq_23483671/article/details/79017609

南桥北木
16分钟前
0
0
产品上新|ZStack3.5.0正式发布啦!

海量产品资料传送门~ 一、ZStack全线产品下载通道汇总 社区版(免费): https://www.zstack.io/product/zstack_open_source/ 企业版下载: https://www.zstack.io/product/zstack_enterpris...

ZStack社区版
18分钟前
0
0
mysql 大表分页查询 翻页 优化方案

mysql分页查询是先查询出来所有数据,然后跳过offset,取limit条记录,造成了越往后的页数,查询时间越长 一般优化思路是转换offset,让offset尽可能的小,最好能每次查询都是第一页,也就是...

花树堆雪
22分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部