最近用到了XML数据 ,今天分享一下我对SAX的理解
sax 是基于事件驱动。那么什么是事件驱动呢(请自行百度)简单点说 就是触发一个事件 去执行某些操作;
sax在解析XML时 是边读取边解析,不会将整个文档加载到内存中。而是读到一个元素解析一个元素,和上下的元素是关联不上的,占用内存较小。这也是非常适合Android这种内存较小的嵌入式设备内存的原因;
sax在读取文档的时候激活一系列的事件并执行一些操作。
在开始读取文档的时候触发 startDocument() ;
读取到一个元素触发 startElement();
读取文本 触发characters(); ps:即使是读取到换行符也会触发
元素读取完毕 触发 endElement();
读取完整个文档触发 endDocument();
上述事件 基本就把xml文档读取完毕了,这些方法在DefaultHandle中已经封装好了,我们做的就是重写这些方法就可以了
student XML文件
<Students><Student id&#61;"0"><name>张三name><clazz>13班clazz><age>17age>Student>
Students>
创建 StudentHandler 继承自 DefaultHandler
package com.skymxc.demo.parsexml;import android.text.TextUtils;
import android.util.Log;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;import java.util.ArrayList;
import java.util.List;/*** Created by sky-mxc*/
public class StudentHandler extends DefaultHandler {private List
}
Handler中的执行过程解析 读取过程如下&#xff0c;可以看出 就算根节点没有文本也触发了characters() 因为会读取换行符 所以慎重处理
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;startDocument()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;startElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;Students
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;startElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;Student
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;startElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;name
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;endElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;name
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;startElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;clazz
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;endElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;clazz
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;startElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;age
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;endElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;age
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;endElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;Student
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;endElement()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;Students
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;endDocument()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
startElement() 参数如下 xml 文件中并没有定义 命名空间 和任何前缀
uri &#xff1a;为空
qName &#xff1a;也是元素的名字并没有带有前缀
localName&#xff1a; 当前元素的名字
E/Tag: &#61;&#61;&#61;startElement():uri&#61;&#61;&#61;&#61;&#61;&#61;
E/Tag: &#61;&#61;&#61;startElement():localName&#61;&#61;&#61;&#61;&#61;&#61;Student
E/Tag: &#61;&#61;&#61;startElement():qName&#61;&#61;&#61;&#61;&#61;&#61;Student
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
characters()参数如下
start :开始下标
length &#xff1a;长度
E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;characters()&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;start:0E/Tag: &#61;&#61;&#61;&#61;&#61;&#61;length:3E/Tag: &#61;&#61;&#61;&#61;当前元素:clazz&#61;&#61;&#61;文本值&#xff1a;13班
创建SAXParse 设置解析内容
SAXParserFactory factory &#61; SAXParserFactory.newInstance();StudentHandler handler &#61; new StudentHandler();try {SAXParser parser &#61; factory.newSAXParser();parser.parse(getAssets().open("students.xml"),handler);Log.e("Tag","&#61;&#61;&#61;Size:"&#43;handler.getStudents().size());for (Student stu :handler.getStudents()){Log.e("Tag","&#61;&#61;Name:"&#43;stu.getName()&#43;"&#61;&#61;&#61;Age:"&#43;stu.getAge()&#43;"&#61;&#61;&#61;&#61;Clazz:"&#43;stu.getClazz()&#43;"&#61;&#61;id:"&#43;stu.getId());}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
读取结果
E/Tag: &#61;&#61;Name:张三&#61;&#61;&#61;Age:17&#61;&#61;&#61;&#61;Clazz:13班&#61;&#61;id:0
对于SAX的理解就这些了
为什么只有深夜 才有感觉呢&#xff0c;唉…..发愁github地址 &#xff1a;https://github.com/sky-mxc/AndroidDemo/tree/master/parsexml