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

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;

    @Override
    protected 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" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="cn.lixyz.xmltest.activity.MainActivity" >

        <Button
            android:id="@+id/bt_writexml_dom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="clickButton"
            android:text="DOM方式生成XML" />

        <Button
            android:id="@+id/bt_readxml_dom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="clickButton"
            android:text="DOM方式读取XML" />

        <Button
            android:id="@+id/bt_writexml_sax"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="clickButton"
            android:text="SAX方式生成XML" />

        <Button
            android:id="@+id/bt_readxml_sax"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="clickButton"
            android:text="SAX方式读取XML" />

        <Button
            android:id="@+id/bt_writexml_pull"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="clickButton"
            android:text="PULL生成XML" />

        <Button
            android: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;
        }

        @Override
        public 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));
                }
            }
        }

        @Override
        public 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;
        }

        @Override
        public void startDocument() throws SAXException {
            // TODO Auto-generated method stub
            // super.startDocument();
            dataList = new ArrayList<Student>();
        }

        @Override
        public 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;
        }
    }
}
时间: 2024-08-05 19:36:03

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

Android笔记(四十五) Android中的数据存储——XML(一)DOM解析器

DOM解析XML在j2ee开发中比较常见,在Dom解析的过程中,是先把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式显然是一种比较消耗内存的方式,对于像手机这样的移动设备来讲,内存是非常有限的,所以对于比较大的XML文件,不推荐使用这种方式,但是Dom也有它的优点,它比较直观,在xml文档比较小的情况下也可以考虑使用dom方式. 代码演示: MainActivity.java package cn.lixyz.xmltest.activity; impo

Android学习四、Android中的Adapter

一.Adapter的介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set. 一个Adapter是Ad

Android 笔记-Fragment 与 Activity之间传递数据

Fragment 与 Activity之间传递数据有两种方法,一种是使用setArgument,一种是使用接口回调.下面先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这里打个比喻:假如Activity是皇帝,它设立了三个部门(如三省六部),分别是Fragment1,Fragment2和Fragemnt3: 现在他现在要吩咐部门Fragment1去做一些事情,比如说:领兵攻打岛国!!好,它肯定不自己跑去告诉该部门的. 一般来说,会有个宰相或者太监总管来负责皇帝口谕是

Android笔记(五):Android中的Radio

原文地址:http://irving-wei.iteye.com/blog/1076097 上篇介绍了CheckBox,这节,将接触到的是RadioGroup和RadioButton. 它们的关系是:一个RadioGroup对应多个RadioButton,而一个RadioGroup中的RadioButton只能同时有一个被选中,它的选中值就是该RadioGroup的选中值. 这一节的代码运行效果图如下所示: 具体的代码编写过程如下: 首先在strings.xml中添加本程序所要用到的字符串: X

67.Android中的数据存储总结

转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d02ede7a741b45e801d74e#rd 本篇文章会帮助大家快速了解Android中各种数据存储机制的应用场景以及基本使用方法,力求在头脑中建立一个“目录”.有了这个目录,具体使用细节在实际应用时再查询文档即可得到. 0. 概述 Android为我们提供了以下存储机制: Shared Preferenc

Android中的数据存储

Android中的数据存储主要分为三种基本方法: 1.利用shared preferences存储一些轻量级的键值对数据. 2.传统文件系统. 3.利用SQLite的数据库管理系统. 对SharedPreferences对象和SQLite数据库,它们的数据仅对创建它们的应用是可访问的. (比如,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE现在(since API 17)已经被标记为deprecated). 换句话说,它们不是共享的,如果需要在不同的应用之间

Java基础知识强化之IO流笔记45:IO流练习之 把集合中的数据存储到文本文件案例

1. 把集合中的数据存储到文本文件案例:    需求:把ArrayList集合中的字符串数据存储到文本文件 ? (1)分析:通过题目的意思我们可以知道如下的一些内容,ArrayList集合里存储的是字符串.遍历ArrayList集合,把数据获取到.然后存储到文本文件中.文本文件说明使用字符流. (2) 数据源: ArrayList<String> -- 遍历得到每一个字符串数据 目的地: a.txt -- FileWriter -- BufferedWriter 2. 代码示例: 1 pack

定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据?

原文:http://www.iteye.com/problems/77856 定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据? 表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗? 这个真的是比较困难. 首先,你要从客户机oracle取数据,因为这1分钟间隔之内不知道用户机新增加了哪些数据(大部分情况下是用户使用别的系统插入数据,而你又没有这个系统的程序接口

SolrCloud中索引数据存储于HDFS

SolrCloud中索引数据存储于HDFS 本人最近使用SolrCloud存储索引日志条件,便于快速索引,因为我的索引条件较多,每天日志记录较大,索引想到将日志存入到HDFS中,下面就说说怎么讲solr的索引条件数据存储到HDFS中. 一.准备工作 Solr环境或SolrCloud集群,如果不会安装可以看一下Solr5.5.4单机部署或者SolrCloud集群部署 HDFS分布式系统环境,如果不会安装的可以看一下Hadoop2.5.0安装部署 本人就以Solr5.5.4+Tomcat8.5.6单