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. 文档对象模型 DOM

    1 DOM概述 1.1 什么是DOM 文档对象模型 Document Object Model 文档对象模型 是表示和操作 HTML和XML文档内容的基础API 文档对象模型,是W3C组织推荐的处理可 ...

  2. day 63 Django基础九之中间件

    Django基础九之中间件   本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学 ...

  3. Python中的正则

    regex_lst = [ ('字符组',), ('非打印字符',), ('特殊字符',), ('定位符',), ('限定符',), ('re模块',), ('分组命名',), ('或匹配',), ( ...

  4. HDU - 5017 Ellipsoid(模拟退火)

    题意 给一个三维椭球面,求球面上距离原点最近的点.输出这个距离. 题解 模拟退火. 把\(z = f(x, y)\)函数写出来,这样通过随机抖动\(x\)和\(y\)坐标就能求出\(z\). 代码 / ...

  5. datagrid的基本属性&查询和清空功能的实现

    1.datagrid基本属性 <script charset=UTF-8"> $(function(){ $("#datagrid").datagrid({ ...

  6. IOS开发---菜鸟学习之路--(五)-MacBook购买前后感想

    前几天刚入手了一台MACBOOK AIR 13寸 13版的 这几天使用过来个人感觉还是非常不错的. 这几天每天晚上都抱着她玩到十一.二点. 今天晚上突然想起来好久没续写博客了.就连忙开始码字了. 此章 ...

  7. 34、Java集合框架List,Map,Set等全面介绍(转载)

      Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构.   Java集合框架的基本接口/类层次结构: java.util.C ...

  8. AppDOMain(摘录)

    AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序. AppDomain是CLR实现 代码隔离 的基本机制. 每一个AppDomain可以单独运行.停止:每个App ...

  9. Python数据分析基础——读写CSV文件

    1.基础python代码: #!/usr/bin/env python3 # 可以使脚本在不同的操作系统之间具有可移植性 import sys # 导入python的内置sys模块,使得在命令行中向脚 ...

  10. 聊聊、Java 命令 第二篇

    第一篇类之间没有依赖关系,所以比较简单,这一篇来看看有依赖的类怎么编译和执行. (一)Java 运行 class 有依赖 Person 是一个接口,只有一个 getName 方法.Man 则实现了 P ...