昨天由于时间比较匆忙只写了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解析的更多相关文章

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

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

  2. 一起学Android之Xml与Json解析

    概述 在网络中,数据交互通常是以XML和Json的格式进行,所以对这两种格式的数据进行解析,是Android开发中的必备功能,本文以一个简单的小例子,简述Android开发中Xml和Json解析的常用 ...

  3. xml的SAX解析和dom解析的区别

    一,区别 DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 ...

  4. Android中的几种解析XML文件的类

    Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如 ...

  5. Android中XML解析

    package com.example.thebroadproject; public class Book { private int id; private String name; privat ...

  6. Android中XML解析-Dom解析

    Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...

  7. Android中XML解析-PULL解析

    前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 ...

  8. Android解析XML之SAX解析器

    SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件 ...

  9. Android中XML解析,保存的三种方法

    简单介绍 在Android开发中,关于XML解析有三种方式,各自是: SAX 基于事件的解析器.解析速度快.占用内存少.非常适合在Android移动设备中使用. DOM 在内存中以树形结构存放,因此检 ...

随机推荐

  1. IAR环境搭建注意点

    1. include文件添加 Options->C/C++ Compiler 中的Preprocessor中增加一般的头文件 同时 在Assembler中的Preprocessor标签下添加$P ...

  2. 一步一步写数据结构(BST-二叉排序树)

    二叉排序树的重要性不用多说,下面用c++实现二叉排序树的建立,插入,查找,修改,和删除.难点在于删除,其他几个相对比较简单. 以下是代码: #include<iostream> using ...

  3. Android中selector背景选择器

    http://blog.csdn.net/forsta/article/details/26148403 http://blog.csdn.net/wswqiang/article/details/6 ...

  4. CSS 显示或隐藏子元素

    很多时候我们仅仅只是想让鼠标移动入某个元素,然后显示出某个元素. 大多数博客的标题或内容都是:使用CSS实现鼠标悬停在一行上,显示某些元素 很遗憾,这是错误的,鼠标悬停后,尽管CSS标准中有定义此种方 ...

  5. Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Could not create connection to database server.

    报错信息:Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQL ...

  6. jQuery 插件写法示例

    1.插件 taskStaticBar.js /**自定义任务进度条插件,用于发布任务单的显示进度 * 先初始化init() * 配置项type:1,任务发布方:type=2,生产方 * 然后传入sho ...

  7. Swift2.0语言教程之类的嵌套与可选链接

    Swift2.0语言教程之类的嵌套与可选链接 Swift2.0语言类的嵌套 在一个类中可以嵌套一个或者多个类.它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套.下面依次讲解这两种方式. S ...

  8. 1008 Elevator (20)(20 point(s))

    problem The highest building in our city has only one elevator. A request list is made up with N pos ...

  9. 利用python制作电子签名

    有时候我们需要在文档里粘上电子签名,通常使用photoshop制作,但是通常photoshop软件还需要下载.安装,对于不经常使用的人来说,单独装这个软件没啥必要. 因此我们可以利用python对签名 ...

  10. 【BZOJ】3195: [Jxoi2012]奇怪的道路【状压/奇偶性】【思路】

    3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 802  Solved: 529[Submit][Statu ...