欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android SAX解析XML

程序员文章站 2022-06-16 15:45:08
...

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)




android SAX解析XML


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);
	}	
}