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);
}
}
上一篇: 使用sax解析大量的Excel数据
下一篇: XML解析