Android中XML解析-SAX解析
昨天由于时间比较匆忙只写了Android中的XML解析的Dom方式,这种方式比较方便,很容易理解,最大的不足就是内容多的时候,会消耗内存。SAX(Simple API for XML)是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。这次使用SAX解析XML文件接着我们来看看另一种解析xml的方式,通过sax来对xml文档进行解析。
自定义Handler
SAX解析XML文件采用的是事件驱动,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。Android中Default已经封装了这些方法,继承DefaultHandler一般来说需要重写的方法有四个:
//用于处理文档解析开始事件 public void startDocument()throws SAXException //处理元素开始事件,从参数中可以获得元素所在名称空间的uri,元素名称,属性类表等信息 public void startElement(String namespacesURI , String localName , String qName , Attributes atts) throws SAXException //处理元素结束事件,从参数中可以获得元素所在名称空间的uri,元素名称等信息 public void endElement(String namespacesURI , String localName , String qName) throws SAXException //处理元素的字符内容,从参数中可以获得内容 public void characters(char[] ch , int start , int length) throws SAXException
自定义的BookHandler:
public class BookHandler extends DefaultHandler {
private static List<Book> bookList = null;
private static String tagName;
private Book book = null;
public List<Book> getBooks() {
return bookList;
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
}
public BookHandler() {
super();
bookList = new ArrayList<Book>();
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 读取Book
tagName = localName;
if (localName.equals("Book")) {
book = new Book();
book.setName(attributes.getValue("name"));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (localName.equals("Book")) {
bookList.add(book);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String value = new String(ch, start, length).trim();
if(value != null && !"".equals(value) && !"\n".equals(value)) {
switch (tagName) {
case "Title":
Log.i("titleString", value);
book.setTitle(value);
}
}
}
}
Demo实现
看下效果图,跟上次一样:

Book.xml中的内容:
<?xml version="1.0" encoding="utf-8"?>
<Books>
<Book name="康师傅的亿万帝国" >
<Title>
据周元根的小学同学回忆,大约7岁那年,周元根开始读小学,由于和别人重名,于是改了名字。但他在村里一直沿用“周元根”这个名字,周家祖坟的5块墓碑上,刻的也是“周元根”这个名字。
</Title>
<Picture>
http://p.qpic.cn/ninja/0/ninja1406636943/0
</Picture>
</Book>
<Book name="徐才厚受贿额特别巨大" >
<Title>
根据最高人民检察院授权,军事检察院对中央军委原副主席徐才厚以涉嫌受贿犯罪立案侦查。2014年10月27日,对该案侦查终结,移送审查起诉。
</Title>
<Picture>
http://www.sinaimg.cn/dy/slidenews/1_img/2014_44/2841_506865_709392.jpg
</Picture>
</Book>
<Book name="发改委副司长魏鹏远" >
<Title>
最高人民检察院反贪污贿赂总局局长徐进辉今日表示,煤炭司副司长魏鹏远家中搜查发现现金折合人民币2亿余元,成为建国以来检察机关一次起获赃款现金数额最大的案件。
</Title>
<Picture>
http://img1.cache.netease.com/catchpic/D/DC/DCB2315FD0F50C665BB1474768192642.jpg
</Picture>
</Book>
</Books>
获取XML文件中的内容:
public List<Book> getBooksBySAX(String fileName){
//实例一个SAX工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//实例一个解析器对象
SAXParser parser = factory.newSAXParser();
//实例化一个XML解析流
XMLReader reader = parser.getXMLReader();
//自定义的Handler
BookHandler bookHandler=new BookHandler();
reader.setContentHandler(bookHandler);
reader.parse( new InputSource(this.getResources().getAssets().open("Book.xml")));
list=bookHandler.getBooks();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
Activity中的调用:
list=getBooksBySAX("Book.xml");
Log.i("test",String.valueOf(list.size()));
View view = getLayoutInflater().inflate(R.layout.activity_book_sax, null);
ListView listView = (ListView) findViewById(R.id.list_sax);
listView.setAdapter(new saxAdapter());
自定义的Adapter:
class saxAdapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Book book = (Book) list.get(position);
View view = null;
if (convertView == null) {
LayoutInflater layoutInflater = getLayoutInflater();
view = layoutInflater.inflate(R.layout.book, null);
} else {
view = convertView;
};
TextView titleView = (TextView) view.findViewById(R.id.itemTitle);
titleView.setText(book.getName());
TextView contentView = (TextView) view.findViewById(R.id.itemText);
contentView.setText(book.getTitle());
return view;
}
}
这里面最重要的就是自定义Handler,里面需要注意的是startElement,endElement,characters执行顺序的问题,顺序是startElement=>characters=>endElement,先解析标签,直到找到内容之后才开始endElement。
Android中XML解析-SAX解析的更多相关文章
- android基础---->XMl数据的解析
在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...
- 一起学Android之Xml与Json解析
概述 在网络中,数据交互通常是以XML和Json的格式进行,所以对这两种格式的数据进行解析,是Android开发中的必备功能,本文以一个简单的小例子,简述Android开发中Xml和Json解析的常用 ...
- xml的SAX解析和dom解析的区别
一,区别 DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 ...
- Android中的几种解析XML文件的类
Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如 ...
- Android中XML解析
package com.example.thebroadproject; public class Book { private int id; private String name; privat ...
- Android中XML解析-Dom解析
Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...
- Android中XML解析-PULL解析
前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 ...
- Android解析XML之SAX解析器
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件 ...
- Android中XML解析,保存的三种方法
简单介绍 在Android开发中,关于XML解析有三种方式,各自是: SAX 基于事件的解析器.解析速度快.占用内存少.非常适合在Android移动设备中使用. DOM 在内存中以树形结构存放,因此检 ...
随机推荐
- Java内存是怎么管理的
JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 ( ...
- Jquery的方法(一)
一.文档操作1.内部插入:append(),appendTo(),prepend():2.外部插入:after(),before():3.删除操作:remove(),empty():4.克隆操作:cl ...
- dhcp 提示could not load neutron.agent
错误日志如下: N版存在问题,其它版本不知道 解决方法(代码问题): /usr/lib/python2.7/site-packages/neutron/common/utils.py 在这个方法上(d ...
- HTML 模板继承
网站模板的设计,一般的,我们做网站有一些通用的部分,比如 导航,底部,访问统计代码等.合理的规划模板往往会减少工作量,同时也使得罗乱.难以阅读的静态页面布局变得优雅. 假设,我们的网站主页面除了正文是 ...
- 转 TCP/IP的三次握手与四次挥手详解
TCP((Transmission Control Protocol)传输控制协议,是一个面向连接的协议.在运用此协议进行数据传输前都会进行连接的建立工作(三次握手):当数据传输完毕,连接的双方都会通 ...
- hdu 4435 第37届ACM/ICPC天津现场赛E题
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题目:给出N个城市,从1开始需要遍历所有点,选择一 ...
- 【BZOJ-3123】森林 主席树 + 启发式合并
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2738 Solved: 806[Submit][Status] ...
- 通过Roslyn构建自己的C#脚本(更新版)
之前写过文章介绍过如何通过Roslyn构建自己的C#脚本,但那篇文章是参考自Roslyn CTP版的,记得本来想等到Roslyn正式版出来重新更新一下文档的,不过记得后来Roslyn是跳票了的,Scr ...
- 垃圾收集简介 - GC参考手册
http://blog.csdn.net/column/details/14851.html
- CentOS 5.8 上安装 systemtap-2.6 转
http://segmentfault.com/a/1190000002541077#articleHeader1