(以下文章基本照抄郭霖大神的《第一行代码》)

Android之 解析XML文件(1)—— Pull解析 中我们讲了Pull方式解析XML文件。今天讲另外一种方式,SAX解析XML文件。

首先还是先看代码。

一、 SAX解析参考代码

private void parseXMLWithSAX(String xmlData){
try{
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
//将ContentHandler的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
//开始执行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
}catch(Exception e){
e.printStackTrace();
}
}

这里我们看到SAX解析看起来要比Pull解析简洁明了很多。

二、 相关类简介

1、 SAXParserFactory 

SAXParserFactory 与 XmlPullParserFactory类相似。也是提供SAXParser 实例的一个工厂。

下面是Android API中对 SAXParserFactory类的定义。

下面是SAXParserFactory中定义的方法。代码中使用到的 newInstance() 与 newSAXParser() 分别用于产生一个SAXParserFactory实例和产生一个SAXParser实例。

2、XMLReader

XMLReader是一个接口。通过它的setContentHandler()方法,可以设置解析事件的处理handler,通过parse()方法可以开始解析。

XMLReader的实例是通过SAXParser类的 getXMLReader()方法来获取的。

3、ContentHandler

上诉代码中ContentHandler类是我们自己写的类,继承自DefaultHandler类。DefaultHandler类是SAX2事件处理的默认基础类。

它提供了在四个核心的SAX处理类中的所有回调的默认实现。我们可以继承该类,在对应的方法中重写我们的处理逻辑。

下面是Android API中对DefaultHandler类的描述。

我们继承的DefaultHandler类 具体代码如下:

public class ContentHandler extends DefaultHandler{

    private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version; //初始化
@Override
public void startDocument() throws SAXException{
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
} @Override
public void startElement(String uri,String localName,
String qName,Attributes attributes) throws SAXException{
//记录当前结点名
nodeName = localName;
} @Override
public void characters(char[] ch,int start,
int length) throws SAXException{
//根据当前结点名判断将内容添加到哪一个StringBuilder对象中
if("id".equals(nodeName)){
id.append(ch,start,length);
}else if("name".equals(nodeName)){
name.append(ch,start,length);
}else if("version".equals(nodeName)){
version.append(ch,start,length);
}
} @Override
public void endElement(String uri,String localName,
String qName) throws SAXException{
if("app".equals(localName){
Log.d("ContentHandler","id is" + id.toString().trim());
Log.d("ContentHandler","name is" + name.toString().trim());
Log.d("ContentHandler","version is" + version.toString().trim());
//最后还要讲StringBuilder清空
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
} @Override
public void endDocument throws SAXException{
}
}

可以看到在ContentHandler这个处理类中对xml数据的处理方式与Pull解析是类似的。所以SAX解析只不过是将解析用到的方法封装起来,代码书写的时候逻辑更为清晰。

综上,使用SAX解析XML数据我们需要做以下几步:

1、使用SAXParserFactory 类中的newInstance()方法获取SAXParserFactory 类实例。

2、通过SAXParserFactory 类实例的newSAXParser()方法获取SAXParser实例

3、通过SAXParser实例的getXMLReader()获取XMLReader的实例

4、XMLReader实例调用setContentHandler(ContentHandler contentHandler)方法设置解析所需的处理事件

5、自定义一个类继承自 DefaultHandler,重写我们需要的方法(这些方法里面是我们用于处理XML数据的逻辑)。

6、最后调用XMLReader的parse()方法解析数据。

Android 之XML数据解析(2)—— SAX解析的更多相关文章

  1. XML解析之SAX解析技术案例

    Java代码: package com.xushouwei.xml; import java.io.File; import java.io.IOException; import java.text ...

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

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

  3. 非常简单的XML解析(SAX解析、pull解析)

    这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 package com.example.demo.service; import java.io.IOException; import ...

  4. XML的概述,.Dom4解析和SAX解析

    1.什么是XML XML 指可扩展标记语言(EXtensible Markup Language) html(hyper text markup langauge) XML 是一种标记语言,很类似 H ...

  5. XML解析之sax解析案例(二)使用sax解析把 xml文档封装成对象

    Demo1类: import java.io.File; import java.util.List; import javax.xml.parsers.SAXParser; import javax ...

  6. 经典面试题:一张表区别DOM解析和SAX解析XML

                                                                                 ============DOM解析    vs ...

  7. Dom4j解析和sax解析xml

    xml基础知识 1)标签对大小写敏感,2)xml解析方式有两种dom解析和sax解析  3)常用的解析工具有dom的dom4j和sax的sax解析工具 4)文档声明中使用<?xml versio ...

  8. java解析XML之DOM解析和SAX解析(包含CDATA的问题)

    Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ...

  9. XML解析(二) SAX解析

    XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...

  10. XML 解析---dom解析和sax解析

    眼下XML解析的方法主要用两种: 1.dom解析:(Document Object Model.即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML ...

随机推荐

  1. VS Code 配置删除左边单词快捷键(同Sublime 和 Atom)

    VS Code 中删除一行的快捷键默认是 cmd + shift + k,或者使用简介 cmd + x,对于一个长期使用 Sublime 和 Atom 的程序猿来说,在VS Code 上删除行,特别是 ...

  2. c语言中使用自带的qsort(结构体排序)+ 快排

    c中没有自带的sort函数emm 不过有自带的qsort函数 (其实用法都差不多(只是我经常以为c中有sort 头文件要用 #include <stdlib.h> 一定要重新把指针指向的值 ...

  3. 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂

    [题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...

  4. javaScript基础语法介绍

    简介 JavaScript是一种脚本语言. (脚本,一条条的文字命令.执行时由系统的一个解释器,将其一条条的翻译成机器可识别的指令,然后执行.常见的脚本:批处理脚本.T-SQL脚本.VBScript等 ...

  5. js小记:对象、原型及原型链、面向对象编程

    一.js对象 1.js对象 js对象是一种复合数据类型,它可以把多个(不同类型的)数据集中在一个变量中,并且给每个数据起名字. 2.对象与数组 对象的每个数据有对应的名字(属性名),我们通过叫名字访问 ...

  6. 2017 ACM暑期多校联合训练 - Team 3 1008 HDU 6063 RXD and math (莫比乌斯函数)

    题目链接 Problem Description RXD is a good mathematician. One day he wants to calculate: ∑i=1nkμ2(i)×⌊nk ...

  7. [写出来才有价值系列:node.js]node.js 02-,learnyounode

    安装learnyounode: npm install g learnyounode 官方说直接 但是我发现不行,很慢几乎就是死在那里了 还好有淘宝的东西给我们用https://npm.taobao. ...

  8. java并发容器

    同步容器将所有对容器状态的访问都串行化,以实现线程安全性.这种方式的缺点是严重降低并发性.Java 5.0提供了多种并发容器来改进同步容器的性能.如ConcurrentHashMap代替同步且基于散列 ...

  9. Maven如何发布项目到一个Tomcat中

    首先,在本地tomcat的conf/tomcat-users.xml 中配置一个user,准备让maven接入时使用: <role rolename="admin-gui"/ ...

  10. windows下安装多个mysql

    1.正常安装mysql5.1.33 安装服务名为mysql3306 安装目录d:\mysql5.1\3306 安装完成后,关闭服务 ① 复制安装文件 将默认安装目录C:\Documents and S ...