SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。下面是一些ContentHandler接口常用的方法:

startDocument():当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。

endDocument():和上面的方法相对应,当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。

startElement(String namespaceURI, String localName, String qName, Attributes atts) :当读到一个开始标签的时候,会触发这个方法。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过atts可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。

endElement(String uri, String localName, String name):这个方法和上面的方法相对应,在遇到结束标签的时候,调用这个方法。

characters(char[] ch, int start, int length) :这个方法用来处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。

示例代码:

MainActivity.java

package cn.lixyz.xmltest.activity;import java.util.List;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import cn.lixyz.xmltest.R;
import cn.lixyz.xmltest.model.Student;
import cn.lixyz.xmltest.parser.DOMForXML;
import cn.lixyz.xmltest.parser.PULLForXML;
import cn.lixyz.xmltest.parser.SAXForXML;public class MainActivity extends Activity {private Button bt_readxml_dom, bt_writexml_dom, bt_writexml_sax, bt_readxml_sax, bt_readxml_pull, bt_writexml_pull;private List<Student> list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findView();}private void findView() {bt_readxml_dom = (Button) findViewById(R.id.bt_readxml_dom);bt_writexml_dom = (Button) findViewById(R.id.bt_writexml_dom);bt_writexml_sax = (Button) findViewById(R.id.bt_writexml_sax);bt_readxml_sax = (Button) findViewById(R.id.bt_readxml_sax);bt_readxml_pull = (Button) findViewById(R.id.bt_readxml_pull);bt_writexml_pull = (Button) findViewById(R.id.bt_writexml_pull);}public void clickButton(View view) {DOMForXML domForXML;SAXForXML saxForXML;PULLForXML pullForXML;switch (view.getId()) {case R.id.bt_readxml_dom:domForXML = new DOMForXML();domForXML.domReadXML();break;case R.id.bt_writexml_dom:domForXML = new DOMForXML();domForXML.domWriterXML();break;case R.id.bt_readxml_sax:saxForXML = new SAXForXML();saxForXML.saxReaderXML();break;case R.id.bt_writexml_sax:saxForXML = new SAXForXML();saxForXML.saxWriterXML();break;case R.id.bt_writexml_pull:pullForXML = new PULLForXML();pullForXML.pullWriterXML();break;case R.id.bt_readxml_pull:pullForXML = new PULLForXML();pullForXML.pullReaderXML();break;}}}

activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="cn.lixyz.xmltest.activity.MainActivity" ><Buttonandroid:id="@+id/bt_writexml_dom"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="clickButton"android:text="DOM方式生成XML" /><Buttonandroid:id="@+id/bt_readxml_dom"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="clickButton"android:text="DOM方式读取XML" /><Buttonandroid:id="@+id/bt_writexml_sax"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="clickButton"android:text="SAX方式生成XML" /><Buttonandroid:id="@+id/bt_readxml_sax"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="clickButton"android:text="SAX方式读取XML" /><Buttonandroid:id="@+id/bt_writexml_pull"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="clickButton"android:text="PULL生成XML" /><Buttonandroid:id="@+id/bt_readxml_pull"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="clickButton"android:text="PULL解析XML" /></LinearLayout></ScrollView>

SAXForXML.java

package cn.lixyz.xmltest.parser;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;import android.util.Log;
import cn.lixyz.xmltest.model.Student;public class SAXForXML {public void saxWriterXML() {try {// 数据源List<Student> listData = createStudents();SAXTransformerFactory saxTransformerFactory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();TransformerHandler transformerHandler = saxTransformerFactory.newTransformerHandler();// 设置xml属性Transformer transformer = transformerHandler.getTransformer();transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // 是否缩进transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); // 字符集transformer.setOutputProperty(OutputKeys.VERSION, "1.0"); // 版本号
File fileFolder = new File("data/data/cn.lixyz.xmltest/files");if (!fileFolder.exists()) {fileFolder.mkdir();Log.d("TTTT", "文件夹不存在,已经创建");}FileOutputStream fileOutputStream = new FileOutputStream(new File("data/data/cn.lixyz.xmltest/files/studentsForSAX.xml"));transformerHandler.setResult(new StreamResult(fileOutputStream));transformerHandler.startDocument();AttributesImpl attributesImpl = new AttributesImpl();attributesImpl.clear();transformerHandler.startElement("", "", "students", attributesImpl);for (Student student : listData) {attributesImpl.clear();attributesImpl.addAttribute("", "", "id", "", student.getId() + "");transformerHandler.startElement("", "", "student", attributesImpl);attributesImpl.clear();transformerHandler.startElement("", "", "name", attributesImpl);transformerHandler.characters(student.getName().toCharArray(), 0, student.getName().length());;transformerHandler.endElement("", "", "name");attributesImpl.clear();transformerHandler.startElement("", "", "age", attributesImpl);transformerHandler.characters((student.getAge() + "").toCharArray(), 0, student.getName().length());;transformerHandler.endElement("", "", "age");transformerHandler.endElement("", "", "student");}transformerHandler.endElement("", "", "students");transformerHandler.endDocument();} catch (TransformerConfigurationException e) {// TODO Auto-generated catch block
            e.printStackTrace();} catch (FileNotFoundException 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();}}public void saxReaderXML() {try {SAXStudentService studentService = new SAXStudentService();// InputStream inputStream =// this.getClass().getClassLoader().getResourceAsStream("person.xml");FileInputStream fileInputStream = new FileInputStream(new File("data/data/cn.lixyz.xmltest/files/studentsForSAX.xml"));List<Student> students = studentService.getStudents(fileInputStream);for (Student student : students) {Log.d("TTTT", "id=" + student.getId() + ",name=" + student.getName() + ",age=" + student.getAge());}} catch (FileNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();} 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();} catch (Throwable e) {// TODO Auto-generated catch block
            e.printStackTrace();}}// 模拟生成xml的数据private List<Student> createStudents() {List<Student> listData = new ArrayList<Student>();listData = new ArrayList<Student>();Student s1 = new Student();s1.setId(11);s1.setName("张三");s1.setAge(10);listData.add(s1);Student s2 = new Student();s2.setId(22);s2.setName("李四");s2.setAge(11);listData.add(s2);Student s3 = new Student();s3.setId(33);s3.setName("王五");s3.setAge(12);listData.add(s3);Student s4 = new Student();s4.setId(44);s4.setName("赵六");s4.setAge(13);listData.add(s4);Student s5 = new Student();s5.setId(55);s5.setName("刘七");s5.setAge(14);listData.add(s5);return listData;}}

Student.java

package cn.lixyz.xmltest.model;public class Student {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

SAXStudentService.java

package cn.lixyz.xmltest.parser;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;import android.util.Log;
import cn.lixyz.xmltest.model.Student;public class SAXStudentService {public List<Student> getStudents(InputStream inputStream) throws Throwable {SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();StudentHandler studentHandel = new StudentHandler();parser.parse(inputStream, studentHandel);return studentHandel.getStudent();}class StudentHandler extends DefaultHandler {private List<Student> dataList;private String tag;private Student student;public List<Student> getStudent() {return dataList;}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// TODO Auto-generated method stub// super.characters(ch, start, length);if (tag != null) {Log.d("TTTT", "~~~~~~~");String str = new String(ch, start, length);if ("name".equals(tag)) {student.setName(str);} else if ("age".equals(tag)) {student.setAge(Integer.parseInt(str));}}}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes)throws SAXException {// TODO Auto-generated method stub// super.startElement(uri, localName, qName, attributes);if ("student".equals(localName)) {student = new Student();Integer id = new Integer(attributes.getValue(0));student.setId(id);}tag = localName;}@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stub// super.startDocument();dataList = new ArrayList<Student>();}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {// TODO Auto-generated method stub// super.endElement(uri, localName, qName);if ("student".equals(localName)) {dataList.add(student);student = null;}tag = null;}}
}

转载于:https://www.cnblogs.com/xs104/p/4924755.html

Android笔记(四十七) Android中的数据存储——XML(三)SAX解析相关推荐

  1. android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...

    在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23   作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...

  2. Android中的数据存储

    Android中的数据存储 1.SharedPreference存储(共享参数) 1.1.使用SharedPreferences存储和读取数据的步骤 存储数据 保存数据一般分为四个步骤: 使用Acti ...

  3. Polyworks脚本开发学习笔记(四)-利用FILE IMPORT进行数据导入及对齐

    Polyworks脚本开发学习笔记(四)-利用FILE IMPORT进行数据导入及对齐 导入参考及数据 FILE IMPORT_REFERENCE导入参考的CAD文件如igs格式 括号内参数分别为(导 ...

  4. at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验

    Ema{@AVR 学习笔记九.基于 AT24C16 的数据存储实验 ------- 基于 LT_Mini_M16 9.1 用 I/O 口模拟 I2C 总线实现 AT24C16 的读写 9.1.1 .实 ...

  5. datasg中的数据存储情况

    datasg中的数据存储情况 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/27/3846618.html

  6. mysql double 转 字符串_没想到!在MySQL数据库中的数据有这三种类型!

    MySQL数据库是一个或多个数据列构成二维表,它的每一种数据列都有特定类型,而类型决定MySQL是怎么看待该列数据,如果把整型数值存放到字符类型的列中,MySQL则会把它当成字符串来处理. MySQL ...

  7. Swift中的数据存储

    Swift中的数据存储 1.NSUserDefault 用于保存一些用户名密码等,用户下次登录不用重复填写用户名密码 2.SSKeyChain 用于保存设备的唯一ID,用户卸载APP并重装后,保证设备 ...

  8. JavaScript中对象数据存储

    JS中对象数据存储 对象数据存储在堆栈中.栈的数据读取,写入速度快,但是存储的内容较少.堆的读取和写入速度慢,但是存储的内容多.举个例子来说就像电脑中内存和硬盘,内存就像栈,需要经常获取,写入速度比较 ...

  9. Android中的数据存储方式

    Android数据存储的5中方式总结: A:使用SharedPreferences存储方式 B:文件存储数据 C:SQLite数据库存储数据 D:使用ContentProvider存储数据 E:网络存 ...

最新文章

  1. CVPR2020:训练多视图三维点云配准
  2. 使用Android SDK Manager下载sdk时总是出现中断异常的解决办法。
  3. bootstrap源码分析之form、navbar
  4. 万维网发布服务 w3svc 已停止 除非万维_万维网和互联网的区别
  5. Mysql之七种连接查询
  6. 语音识别学习笔记(二)【基于矢量量化的识别技术】
  7. php文件名函数,详解php 获取文件名basename()函数的用法
  8. Pattern类正则表达式的编译表示形式
  9. python3.5安装包_Python 3.5.4详细图文安装教程(附安装包) | 我爱分享网
  10. 流媒体RTMP协议解析
  11. 沙龙回顾|你pick的程序小哥可以C位出道了吗?(内含PPT和演讲稿福利哦!)...
  12. 浅谈setOnClickListener使用方法
  13. android studio anr,Android ANR 分析
  14. 又双叕来分享实用的 好用的 方便的 网页转换器了
  15. TOMCAT原理详解及请求过程
  16. c语言中定义一个十六进制的数,C语言如何定义一个16进制数
  17. padStart 和 padEnd的使用
  18. 小米的逆转密码:MIX2与新零售
  19. Java基础 - 集合框架(5) : Map集合、Collections
  20. MATLAB RANSAC拟合空间直线

热门文章

  1. 北大生物信息学学习(2) 生物学及生物学信息学的发展
  2. c语言注释符的作用有哪两种,C语言编程的注释符号是?
  3. 打开access文件 提示文件名无效_分享在PS软件打开图像时提示无效的JPEG的解决方法...
  4. 目标检测(三)--DPM
  5. C++查漏补缺之流状态
  6. 高中电子技术——指针式万用表调零
  7. lepus监控oracle数据库_数据库监控软件Lepus之修改admin密码
  8. 使命召唤为啥显示新服务器玩家,《使命召唤8》建立服务器和加入自己、别人服务器方法...
  9. Hbase ConnectionFactory
  10. Linux基础之bash shell介绍及基本特性