Android解析XML之SAX解析器
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解析器的更多相关文章
- android基础---->XMl数据的解析
在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...
- 一起学Android之Xml与Json解析
概述 在网络中,数据交互通常是以XML和Json的格式进行,所以对这两种格式的数据进行解析,是Android开发中的必备功能,本文以一个简单的小例子,简述Android开发中Xml和Json解析的常用 ...
- JAVA解析XML之SAX方式
JAVA解析XML之SAX方式 SAX解析xml步骤 通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory 通过SAXParse ...
- xml解析中的sax解析
title: xml解析中的sax解析 tags: grammar_cjkRuby: true --- SAXPasser 类: parser(File file, DefaultHandler ha ...
- sax技术解析xml下jaxp解析器详细代码
*解析xml的两种技术dom和sax dom:根据xml的层级结构在内存中分配一个树形结构,把xml标签,属性,文本封装成对象. sax方式:事件驱动,边读边解析. 在javax.xml.parser ...
- 使用jaxp对比xml进行SAX解析
package cn.itcast.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationExcep ...
- python 解析xml 文件: SAX方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- XML之SAX解析模型
DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢 SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解 ...
- [转载] python 解析xml 文件: SAX方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
随机推荐
- nginx负载均衡集群(二)
nginx负载均衡配置实战 一.配置基于域名虚拟主机的web节点 web02和web01做同样的操作,nginx配置文件如下: [root@web01 conf]# cat nginx.conf wo ...
- 一道JS面试题所引发的"血案",透过现象寻本质,再从本质看现象
觉得本人写的不算很烂的话,可以登录关注一下我的GitHub博客,新手写东西写的不好之处,还望见谅,毕竟水平有限,写东西只为交流提高,一起学习,还望大神多加指点,指出纰漏,和提出宝贵的意见,博客会坚持写 ...
- win10.net 安装出问题0x800F70422
因为安装ooracle数据库的时候需要用到.net但安装的时候出了0x800F70422, 随后就去网上查了下这个错出现的原因,发现是我之前把Windows自带的更新给禁用了 只要把它再开启就行了.
- PHP面向对象编程(1)基础
一.面向对象OOP(Oriented Object Programming) 面向过程的编程 将要实现的功能描述为一个从一开始到结束的连续的“步骤(过程)”. 一次逐步完成这些步骤.如果步骤比较大,又 ...
- Birthday Paradox
Birthday Paradox Sometimes some mathematical results are hard to believe. One of the common problems ...
- Linux命令之---rm
命令简介 rm命令为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命令,使用的时候要特别当 ...
- 用NPOI完成公司任务(主要就是导入导出操作)
注意要先添加程序集的引用 导出到excel: public override IWorkbook writeExecl(string filePath, DataTable dt) { if (Fil ...
- Linux下安装nginx,以及启动和停止
1.安装 安装nginx之前,首先确保系统已经安装了依赖:g++.gcc.openssl-devel.pcre-devel和zlib-devel软件 yum install gcc-c++ yum - ...
- as API一些容易忘记的属性和方法
1.在flash动画里的一些动态文本会随着动画的执行,有抖动,解决问题的方法: tt为动画里的动态文本,tt.transform.matrix=null;
- OpenCV学习笔记(二) cv::Mat
部分内容转自:OpenCV Tuturial,ggicci 在OpenCV Tuturial中可查看Mat的初始化与打印方法. Mat本质上是由两个数据部分组成的类: 矩阵头(包含矩阵尺寸,存储方法, ...