Android学习笔记_7_使用 sax 或者 dom 或者 pull 解析XML文件

一、Pull解析介绍:

  Android上使用SAX和DOM方式解析XML的方法,并且对两种做了简单的比较,通过比较我们知道对在往往内存比较稀缺的移动设备上运行的Android系统来说,SAX是一种比较合适的XML解析方式。但是SAX方式的特点是需要解析完整个文档才会返回,如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式还是会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。

  Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。这是他们主要的区别。而他们的相似性在运行方式上,Pull解析器也提供了类似SAX的事件(开始文档START_DOCUMENT和结束文档END_DOCUMENT,开始元素START_TAG和结束元素END_TAG,遇到元素内容TEXT等),但需要调用next() 方法提取它们(主动提取事件)。

  Android系统中和Pull方式相关的包为org.xmlpull.v1,在这个包中提供了Pull解析器的工厂类XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory实例调用newPullParser方法创建XmlPullParser解析器实例,接着XmlPullParser实例就可以调用getEventType()和next()等方法依次主动提取事件,并根据提取的事件类型进行相应的逻辑处理。

二、准备xml文件:

  文件保存在src目录下

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="1001">
        <name>张三</name>
        <age>27</age>
    </person>
    <person id="1002">
        <name>李四</name>
        <age>25</age>
    </person>
    <person id="1003">
        <name>王五</name>
        <age>28</age>
    </person>
    <person id="1004">
        <name>赵六</name>
        <age>30</age>
    </person>
</persons>
View Code

三、通过Pull解析和保存实现:

package com.example.service;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
import com.example.entity.Person;

public class XMLParse {
    /**
     * 解析xml
     * @param in 输入流
     * @return
     */
    public List<Person> parse(InputStream in) {
        List<Person> persons=null;
        Person person=null;
        try {
            //创建XmlPullParser,有两种方式  
            //方式一:使用工厂类XmlPullParserFactory  
//            XmlPullParserFactory pullFactory = XmlPullParserFactory.newInstance();  
//            XmlPullParser xmlPullParser = pullFactory.newPullParser();  
//          //方式二:使用Android提供的实用工具类android.util.Xml  
            XmlPullParser xmlPullParser = Xml.newPullParser();  
            xmlPullParser.setInput(in, "UTF-8");  
            int event = xmlPullParser.getEventType(); 
            boolean isDone = false;   
            //具体解析xml  
            while ((event != XmlPullParser.END_DOCUMENT)&&(isDone != true)) {  
                switch (event) {
                case XmlPullParser.START_DOCUMENT:
                    persons = new ArrayList<Person>();
                    break;
                case XmlPullParser.START_TAG:
                    if("person".equals(xmlPullParser.getName())){
                        person = new Person();
                        int id = Integer.valueOf(xmlPullParser.getAttributeValue(0));
                        person.setId(id);
                    }
                    if("name".equals(xmlPullParser.getName())){
                        person.setName(xmlPullParser.nextText());
                    }
                    if("age".equals(xmlPullParser.getName())){
                        person.setAge(Integer.valueOf(xmlPullParser.nextText()));
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if("person".equals(xmlPullParser.getName())){
                        persons.add(person);
                        person=null;
                    }
                    break;
                }
                //调用next()方法主动提取事件
                event = xmlPullParser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return persons;
    }
    
    /**
     * 将对象保存成xml文件
     * @param out
     * @param persons
     */
    public void save(OutputStream out,List<Person> persons){
        try {
            XmlSerializer xml = Xml.newSerializer();
            xml.setOutput(out, "UTF-8");
            xml.startDocument("UTF-8", true);
            xml.startTag(null, "persons");
            for (Person person : persons) {
                xml.startTag(null, "person");
                //设置属性
                  xml.attribute(null, "id", person.getId().toString());
                
                xml.startTag(null, "name");
                xml.text(person.getName());//设置内容
                  xml.endTag(null, "name");
                
                xml.startTag(null, "age");
                xml.text(person.getAge().toString());
                xml.endTag(null, "age");
                
                xml.endTag(null, "person");
            }
            xml.endTag(null, "persons");
            xml.endDocument();
            out.flush();//防止是缓冲流
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、测试与结果:

package com.example.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import android.test.AndroidTestCase;
import android.util.Log;

import com.example.entity.Person;
import com.example.service.XMLParse;

public class XMLParseTest extends AndroidTestCase {
    private static String TAG ="XMLParseTest";
    public void testParse() {
        XMLParse p = new XMLParse();
        //Person.xml文件在src目录下
        InputStream in = XMLParseTest.class.getClassLoader().getResourceAsStream("Person.xml");
        List<Person> persons = p.parse(in);
        for (Person person : persons) {
            Log.i(TAG, person.toString());
        }
    }
    public void testSave() {
        try {
            XMLParse p = new XMLParse();
            List<Person> persons=new ArrayList<Person>();
            persons.add(new Person(10001,"tom",25));
            persons.add(new Person(10002,"lily",26));
            persons.add(new Person(10003,"xiaoming",27));
            //将文件保存在当前应用所在包的files文件夹下
            FileOutputStream fos=new FileOutputStream(new File(getContext().getFilesDir(),"xiaoming.xml"));
            p.save(fos, persons);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
}
View Code

  将对象生成xml文件及保存位置:

  

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<persons>
    <person id="10001">
        <name>tom</name>
        <age>25</age>
    </person>    
    <person id="10002">
        <name>lily</name>
        <age>26</age>
    </person>
    <person id="10003">
        <name>xiaoming</name>
        <age>27</age>        
    </person>        
</persons>
View Code

结果(在LogCat中加入XMLParseTest标签):

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值