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. nginx负载均衡集群(二)

    nginx负载均衡配置实战 一.配置基于域名虚拟主机的web节点 web02和web01做同样的操作,nginx配置文件如下: [root@web01 conf]# cat nginx.conf wo ...

  2. 一道JS面试题所引发的"血案",透过现象寻本质,再从本质看现象

    觉得本人写的不算很烂的话,可以登录关注一下我的GitHub博客,新手写东西写的不好之处,还望见谅,毕竟水平有限,写东西只为交流提高,一起学习,还望大神多加指点,指出纰漏,和提出宝贵的意见,博客会坚持写 ...

  3. win10.net 安装出问题0x800F70422

    因为安装ooracle数据库的时候需要用到.net但安装的时候出了0x800F70422, 随后就去网上查了下这个错出现的原因,发现是我之前把Windows自带的更新给禁用了 只要把它再开启就行了.

  4. PHP面向对象编程(1)基础

    一.面向对象OOP(Oriented Object Programming) 面向过程的编程 将要实现的功能描述为一个从一开始到结束的连续的“步骤(过程)”. 一次逐步完成这些步骤.如果步骤比较大,又 ...

  5. Birthday Paradox

    Birthday Paradox Sometimes some mathematical results are hard to believe. One of the common problems ...

  6. Linux命令之---rm

    命令简介 rm命令为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命令,使用的时候要特别当 ...

  7. 用NPOI完成公司任务(主要就是导入导出操作)

    注意要先添加程序集的引用 导出到excel: public override IWorkbook writeExecl(string filePath, DataTable dt) { if (Fil ...

  8. Linux下安装nginx,以及启动和停止

    1.安装 安装nginx之前,首先确保系统已经安装了依赖:g++.gcc.openssl-devel.pcre-devel和zlib-devel软件 yum install gcc-c++ yum - ...

  9. as API一些容易忘记的属性和方法

    1.在flash动画里的一些动态文本会随着动画的执行,有抖动,解决问题的方法: tt为动画里的动态文本,tt.transform.matrix=null;

  10. OpenCV学习笔记(二) cv::Mat

    部分内容转自:OpenCV Tuturial,ggicci 在OpenCV Tuturial中可查看Mat的初始化与打印方法. Mat本质上是由两个数据部分组成的类: 矩阵头(包含矩阵尺寸,存储方法, ...