SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。

SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。

SAX相关类及API

DefaultHandler:是一个事件处理器,可以接收解析器报告的所有事件,处理所发现的数据。它实现了EntityResolver接口、DTDHandler接口、ErrorHandler接口和ContentHandler接口。这几个接口代表不同类型的事件处理器。

利用SAX解析XML,实际上只需要继承DefaultHandler类,然后重写几个关键性方法即可。一般我们需要重写的方法是startDocument、startElement、characters、endElement和endDocument方法。

API解释:

 import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class MyParser extends DefaultHandler{ /**
* 当文档开始解析时此函数被调用
*
* 通常我们需要在这里面做一些初始化的工作,比如分配某些资源
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
} /**
* 当扫描到文档元素节点起始标志时被调用
*
* 通常我们需要做一下标记,或者分配节点资源。
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
} /**
* 扫描到元素节点中的字符串内容时调用此函数
* @param ch 代表元素内容的字符数组(实测时候并不完全表示元素内容,不过这不影响)
* @param start 能够使用的起始位置
* @param length 能够使用的数组长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
} /**
* 扫描到元素节点结束标志时调用
*
* 应该是最重要的一个方法。需要判断节点名作相应的数据解析。
* @param localName 节点名字
* @param qName 含限定符的节点名字
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
} /**
* 扫描文档结束后调用
*
* 如果有些资源需要释放的话,就在这里做好了。
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
} }

API解释

实例

需要解析的persons.xml文件内容如下:

 <?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1" group="1">
<name>张三</name>
<age>24</age>
</person>
<person id="2" group="2">
<name>李四</name>
<age>25</age>
</person>
<person id="3" group="1">
<name>王五</name>
<age>26</age>
</person>
</persons>

定义Person实体类:

/**
* Created by Shane on 2015/4/24.
*/
public class Person {
private int id;
private int group;
private String name;
private int age; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public int getGroup() {
return group;
} public void setGroup(int group) {
this.group = group;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
StringBuilder sb = new StringBuilder(); sb.append("name: " + name);
sb.append(", age: " + age);
sb.append(", id: " + id);
sb.append(", group: " + group); return sb.toString();
}
}

Person.java

定义用于解析XML文件的解析器PersonSAXHandler 类如下:

/**
* Created by Shane on 2015/4/24.
*/
public class PersonSAXHandler extends DefaultHandler{ private static final String TAG_PERSON = "person";
private static final String TAG_NAME = "name";
private static final String TAG_AGE = "age"; private List<Person> persons;
private Person person; private StringBuffer stringBuffer; public List<Person> getPersons() {
return persons;
} @Override
public void startDocument() throws SAXException {
super.startDocument(); persons = new ArrayList<>();
stringBuffer = new StringBuffer();
} @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes); if (localName.equals(TAG_PERSON)) {
person = new Person();
person.setId(Integer.parseInt(attributes.getValue(0)));
person.setGroup(Integer.parseInt(attributes.getValue(1)));
}
stringBuffer.setLength(0); // start a new string buffer.
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length); stringBuffer.append(ch, start, length);
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName); if (localName.equals(TAG_PERSON)) {
persons.add(person);
} else if (localName.equals(TAG_NAME)) {
person.setName(stringBuffer.toString().trim());
} else if (localName.equals(TAG_AGE)) {
person.setAge(Integer.parseInt(stringBuffer.toString().trim()));
} } @Override
public void endDocument() throws SAXException {
super.endDocument();
}
}

包装上述PersonSAXHandler类,定义PersonSAXParser类进行解析:

/**
* Created by Shane on 2015/4/24.
*/
public class PersonSAXParser implements PersonParser{ @Override
public List<Person> parse(InputStream inputStream) {
List<Person> persons = new ArrayList<>();
try {
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
PersonSAXHandler personSAXHandler = new PersonSAXHandler();
saxParser.parse(inputStream, personSAXHandler);
persons = personSAXHandler.getPersons();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {}
}
}
return persons;
}
}

PersonParser接口定义如下:

/**
* Created by Shane on 2015/4/24.
*/
public interface PersonParser {
public List<Person> parse(InputStream inputStream);
}

Android解析XML之SAX解析器的更多相关文章

  1. android基础---->XMl数据的解析

    在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...

  2. 一起学Android之Xml与Json解析

    概述 在网络中,数据交互通常是以XML和Json的格式进行,所以对这两种格式的数据进行解析,是Android开发中的必备功能,本文以一个简单的小例子,简述Android开发中Xml和Json解析的常用 ...

  3. JAVA解析XML之SAX方式

    JAVA解析XML之SAX方式 SAX解析xml步骤 通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory 通过SAXParse ...

  4. xml解析中的sax解析

    title: xml解析中的sax解析 tags: grammar_cjkRuby: true --- SAXPasser 类: parser(File file, DefaultHandler ha ...

  5. sax技术解析xml下jaxp解析器详细代码

    *解析xml的两种技术dom和sax dom:根据xml的层级结构在内存中分配一个树形结构,把xml标签,属性,文本封装成对象. sax方式:事件驱动,边读边解析. 在javax.xml.parser ...

  6. 使用jaxp对比xml进行SAX解析

    package cn.itcast.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationExcep ...

  7. python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  8. XML之SAX解析模型

    DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢 SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解 ...

  9. [转载] python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

随机推荐

  1. Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本

    Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...

  2. PHP 工厂模式介绍

    工厂模式,顾名思义,如同工厂一样,你把原材料放入工厂中,出来的是成品,而你并不需要知道工厂里做了什么.代码中也类似,把主要参数放入一个工厂里,返回的是处理好的数据,我们并不需要工厂里做了什么,只需要知 ...

  3. ZendFramework-2.4 源代码 - 整体架构(类图)

  4. MQTT的学习之Mosquitto发布-订阅(2)

    在<MQTT的学习之Mosquitto安装&使用(1)>一文末尾,我已经模拟了发布-订阅模式,只是那时在服务器直接模拟的,并不是java代码模拟的.下面贴出Java代码 1.首先引 ...

  5. ubuntu 压缩 解压 命令大全

    ubuntu下文件压缩/解压缩命令总结 http://blog.csdn.net/luo86106/article/details/6946255 .gz 解压1:gunzip FileName.gz ...

  6. HDU:4417-Super Mario(离线线段树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  7. PAT乙级1088

    1088 三人行 (20 分) 子曰:“三人行,必有我师焉.择其善者而从之,其不善者而改之.” 本题给定甲.乙.丙三个人的能力值关系为:甲的能力值确定是 2 位正整数:把甲的能力值的 2 个数字调换位 ...

  8. Windows下如何用CMD命令跳转到指定的目录下

    以Window7为例说明,想要跳转到I:\adt-bundle-windows-x86-20130219\sdk\platform-tools目录下. 1.在运行中打开CMD命令窗口如下图所示: 2. ...

  9. mysql 外连接的时候,条件在on后面和条件在where后面的区别

    最近使用mysql的时候碰到一个问题:当一个表外联另一个表的时候,将一些查询条件放在on后面和放在where后面不太一样: 学生分数表stuscore: 当查询语句如下(查询语句1): SELECT ...

  10. Analyze Program Runtime Stack

    Introduce: Process Explorer is an advanced process management utility that picks up where Task Manag ...