Android 之XML数据解析(2)—— SAX解析
(以下文章基本照抄郭霖大神的《第一行代码》)
在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解析的更多相关文章
- XML解析之SAX解析技术案例
Java代码: package com.xushouwei.xml; import java.io.File; import java.io.IOException; import java.text ...
- android基础---->XMl数据的解析
在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...
- 非常简单的XML解析(SAX解析、pull解析)
这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 package com.example.demo.service; import java.io.IOException; import ...
- XML的概述,.Dom4解析和SAX解析
1.什么是XML XML 指可扩展标记语言(EXtensible Markup Language) html(hyper text markup langauge) XML 是一种标记语言,很类似 H ...
- XML解析之sax解析案例(二)使用sax解析把 xml文档封装成对象
Demo1类: import java.io.File; import java.util.List; import javax.xml.parsers.SAXParser; import javax ...
- 经典面试题:一张表区别DOM解析和SAX解析XML
============DOM解析 vs ...
- Dom4j解析和sax解析xml
xml基础知识 1)标签对大小写敏感,2)xml解析方式有两种dom解析和sax解析 3)常用的解析工具有dom的dom4j和sax的sax解析工具 4)文档声明中使用<?xml versio ...
- java解析XML之DOM解析和SAX解析(包含CDATA的问题)
Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档:SAX采用事件驱动的方式解析XML.如同在电 ...
- XML解析(二) SAX解析
XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...
- XML 解析---dom解析和sax解析
眼下XML解析的方法主要用两种: 1.dom解析:(Document Object Model.即文档对象模型)是W3C组织推荐的解析XML的一种方式. 使用dom解析XML文档,该解析器会先把XML ...
随机推荐
- mongodb角色权限
角色说明:Read:允许用户读取指定数据库readWrite:允许用户读写指定数据库dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建.删除,查看统计或访问system.profileus ...
- 5 Techniques To Understand Machine Learning Algorithms Without the Background in Mathematics
5 Techniques To Understand Machine Learning Algorithms Without the Background in Mathematics Where d ...
- 重构改善既有代码设计--重构手法12:Extract Class (提炼类)
某个类做了应该由2个类做的事.建立一个新类,将相关的字段和函数从旧类搬移到新类. 动机:一个类应该是一个清楚地抽象,处理一些明确的责任.但是在实际工作中,类会不断成长扩展.你会在这儿加入一些功能,在哪 ...
- ClassNotFoundException:com.sun.xml.bind.v2.ContextFactory
项目中引入hive-jdbc-1.2.1-standalone.jar包之后,报错如下: Caused by: javax.xml.bind.JAXBException: Provider com.s ...
- 【CodeForces】626 F. Group Projects 动态规划
[题目]F. Group Projects [题意]给定k和n个数字ai,要求分成若干集合使得每个集合内部极差的总和不超过k的方案数.n<=200,m<=1000,1<=ai< ...
- 指针A - 签到题(顺序三元组)
给定一个长度为N的数组A=[A1, A2, ... AN],已知其中每个元素Ai的值都只可能是1, 2或者3. 请求出有多少下标三元组(i, j, k)满足1 ≤ i < j < k ≤ ...
- Spring整合Quartz分布式调度
前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...
- 商城项目(ssm+dubbo+nginx+mysql统合项目)总结(3)
我不会在这里贴代码和详细步骤什么的,我觉得就算我把它贴出来,你们照着步骤做还是会出很多问题,我推荐你们去看一下黑马的这个视频,我个人感觉很不错,一步一步走下来可以学到很多东西.另外,视频和相关文档的话 ...
- sniffer简单使用
跟wireshark类似. 只是说显示的容易忘记所以丢张图记录一下. 该工具还是很坑爹的,不是比赛要用到所以都不是很想弄.一般机器运行不起来.不是蓝屏就是装了运行不了各种闪退,找了学校一台内网服务器才 ...
- MongoDB之安装和基本使用(一)
环境 ubuntu16.04 mongodb基本特点 MongoDB 是一个基于分布式 文件存储的NoSQL数据库;可以把MongoDB想象成一个大py字典. 模式自由 :可以把不同结构的文档存储在同 ...