android SAX解析XML

SAX(Simple APIfor XML)解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。  SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。

SAX的工作原理:SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口。XMLReader通过相应事件处理器注册方法setXXXX()来完成的与ContentHander、DTDHander、ErrorHandler,以及EntityResolver这4个接口的连接。

 

         常用的SAX接口和类:

         Attrbutes:用于得到属性的个数、名字和值。  

         ContentHandler:定义与文档本身关联的事件(例如,开始和结束标记)。大多数应用程序都注册这些事件。

         DTDHandler:定义与DTD关联的事件。它没有定义足够的事件来完整地报告DTD。如果需要对DTD进行语法分析,请使用可选的DeclHandler。

         DeclHandler是SAX的扩展。不是所有的语法分析器都支持它。

         EntityResolver:定义与装入实体关联的事件。只有少数几个应用程序注册这些事件。

         ErrorHandler:定义错误事件。许多应用程序注册这些事件以便用它们自己的方式报错。

         DefaultHandler:它提供了这些接LI的缺省实现。在大多数情况下,为应用程序扩展DefaultHandler并覆盖相关的方法要比直接实现一个接口更容易。

处理器名称

处理事件

注册方式

ContentHandler

解析XML文档内容

setContentHandler(ContentHandler)

ErrorHandler

处理XML文档产生的错误

setErrorHandler(ErrorHandler)

DTDHandler

处理DTD解析时产生的相应事件

setDTDHandler(DTDHandler)

EntityResolver

处理外部实体

setEntityResolver(EntityResolver)






public class Pinfor {

	private String serialNumber;
	
	private String serviceid;
	
	private String type;
	
	private String data;
	
	private String title;
	
	private Object reserved;
	
	public String getSerialNumber() {
		return serialNumber;
	}
	public void setSerialNumber(String serialNumber) {
		this.serialNumber = serialNumber;
	}
	
	public Object getReserved() {
		return reserved;
	}
	public void setReserved(Object reserved) {
		this.reserved = reserved;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}

	public String getServiceid() {
		return serviceid;
	}
	public void setServiceid(String serviceid) {
		this.serviceid = serviceid;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
}

	/**
	 * 从流中直接解析XML
	 * @return
	 */
	public  List<Pinfor> parserXmlBySax(InputStream inputStream){
		XMLContentHandler xmlHandler  = null;
		try {
			//从SAXPsrser中得到一个XMLReader实例
			XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
			//把自己写的handler注册到XMLReader中
			xmlHandler = new XMLContentHandler();
			reader.setContentHandler(xmlHandler);
			//将一个xml文档或者资源变成一个java可以处理的InputStream流后,解析正式开始
			reader.parse(new InputSource(inputStream));			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			Log4debug.e(TAG, "parserXmlBySax",e.getMessage());
		}
		return xmlHandler.getResultList();
	}

//SAX ContentHander解析XML文件处理过程
class XMLContentHandler extends DefaultHandler{
	
	private List<Pinfor> list = null;
	private Pinfor infor = null;
	private String tagName = null;
	
	 public List<Pinfor> getResultList() {
		return list;
	}

	public void setTagName(String tagName) {
		this.tagName = tagName;
	}

	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		list = new ArrayList<Pinfor>();
	}
	
	@Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
	}

	
	//解析节点内容回调函数
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		String data=new String(ch,start,length);
		if (tagName != null) {
			if (tagName.equals("serviceid")) { //对象属性标签
				infor.setServiceid(data);		
			}
			else if (tagName.equals("type")) {
				infor.setType(data);
			}
			else if (tagName.equals("title")) {
				infor.setTitle(data);
			}
			else if (tagName.equals("data")) {
				infor.setData(data);
			}
			else if (tagName.equals("RESERVED")) {
				infor.setReserved(data);
			}
		}
	}

	//XML解析器遇到XML里面的标签时就会调用这个函数
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		if (qName.equals("item")) { //对象标签
			infor = new Pinfor();
		}
		this.setTagName(qName);
	}
	
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		if (qName.equals("item")&& infor!= null) { //对象标签
			list.add(infor);
		}
		this.setTagName(null);
	}

	@Override
	public void startPrefixMapping(String prefix, String uri)
			throws SAXException {
		// TODO Auto-generated method stub
		super.startPrefixMapping(prefix, uri);
	}
	
	@Override
	public void endPrefixMapping(String prefix) throws SAXException {
		// TODO Auto-generated method stub
		super.endPrefixMapping(prefix);
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值