Andrroid解析xml文件之Pull解析



第一次学习xml文件的解析,由于pull技术解析方式比较好用,代码量相对简洁,挑了pull进行学习。

刚开始接触的时候会想:xml文件是做什么用的? 为什么要解析xml文件?
xml在各种开发中都广泛用到,是作为承载数据的一个角色

1、因为我们经常要到网上去获取数据,例如天气预报,数据是以xml文件的格式存在的,所以我们要获取里面的数据,就必须对xml文件进行解析。
2、还有一个作用就是保存你的数据,保存为xml文件的格式,然后要用到的时候再通过程序解析读取调用。

那么解析方法有哪几种呢?
SAX解析器、DOM解析器、PULL解析器、Android.util.Xml类解析方法

区别:
1、DOM在处理XML文件时,将XML文件解析成树状结构并放入内存中进行处理。当xml文件较小时,我们可以选DOM,因为它简单、直观,不过当xml文件过大,或者设备内存空间过小时,不建议使用DOM。
2、SAX则是以事件作为解析XML文件的模式,它将XML文件转化成一系列的事件,由不同的事件处理器决定如何处理。XML文件较大时,选择SAX技术是比较合理的。虽然代码量有些大,但它不需要将所有的XML文件加载到内存中。这样对于有限的Android内存更有效,而且Android提供了一种传统的SAX使用方法以及一个便捷的SAX包装器。
3、PULL解析并未像SAX解析那样监听元素的结束,而是在开始出完成大部分处理。这样有利于提早读取XML文件,可以极大的减少解析时间,这种优化对于连接数据较慢的移动设备尤为重要。对于XML文档较大但只需要文档的一部分时,XML Pull解析器则更为有效的方法

下面是代码实例:
book.xml(要进行解析的文件)

<? xml version= "1.0" encoding = "utf-8"?>

< books>
    <book >
        < id> 1001</ id >
        < name> Thinking In Java </name >
        < price> 80.00</ price >
    </book >
    <book >
        < id> 1002</ id >
        < name> Core Java </name >
        < price> 90.00</ price >
    </book >
    <book >
        < id> 1003</ id >
        < name> Hello, Andriod </name >
        < price> 100.00</ price >
    </book >
</books>

Book.java(Book实体类)

package com.examle.model;

public class Book {
     private String name;
     private int id ;
     private float price ;
     public String getName() {
         return name ;
    }
     public void setName(String name) {
         this .name = name;
    }
     public int getId() {
         return id ;
    }
     public void setId(int id) {
         this .id = id;
    }
     public float getPrice() {
         return price ;
    }
     public void setPrice( float price) {
         this .price = price;
    }

     public String toString(){
         return "id:" + id+ ",name:" +name + ",price:"+ price ;
    }
}
BookParser.java(定义接口)
定义两个方法
1、解析输入流(xml文件),得到Book对象集合
2、序列化Book对象集合,得到xml形式的字符串(将获取到的数据以xml形式存入本地内存中)

package com.example.parser;

import java.io.InputStream;
import java.util.List;

import com.examle.model.Book;

/**
 *
 * @author hasee
 *
 */

public interface BookParser {
    /**
     * 解析输入流    得到Book对象集合。
     * @param is
     * @return
     * @throws Exception
     */
    public List<Book> parse(InputStream is) throws Exception;
    /**
     * 序列化Book对象集合    得到XML形式的字符串
     * @param books
     * @return
     * @throws Exception
     */
    public String serialize(List<Book> books) throws Exception;

}

PullBookParser.java(实现接口)

package com.example.parser;

import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

import com.examle.model.Book;

public class PullBookParser implements BookParser{

    @Override
    public List<Book> parse(InputStream is) throws Exception {
        List<Book> books=null;
        Book book=null;

        XmlPullParser parser=Xml.newPullParser();//有android.util.xml创建一个XmlPullParser实例
        parser.setInput(is,"UTF-8");//设置输入流   并指明编码方式

        int eventType=parser.getEventType();
        while(eventType!=XmlPullParser.END_DOCUMENT){
            switch(eventType){
            case XmlPullParser.START_DOCUMENT:
                books=new ArrayList<Book>();
                break;
            case XmlPullParser.START_TAG:
                if(parser.getName().equals("book")){
                    book=new Book();
                }else if(parser.getName().equals("id")){
                    eventType=parser.next();
                    book.setId(Integer.parseInt(parser.getText()));
                }else if(parser.getName().equals("name")){
                    eventType=parser.next();
                    book.setName(parser.getText());
                }else if(parser.getName().equals("price")){
                    eventType=parser.next();
                    book.setPrice(Float.parseFloat(parser.getText()));
                }
                break;

            case XmlPullParser.END_TAG:
                if(parser.getName().equals("book")){
                    books.add(book);
                    book=null;
                }
                break;
            }
            eventType=parser.next();
        }
        return books;
    }

    @Override
    public String serialize(List<Book> books) throws Exception {
        XmlSerializer serializer=Xml.newSerializer();
        StringWriter writer=new StringWriter();
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", true);
        serializer.startTag("","books");
        for(Book book:books){
            serializer.startTag("", "book");
            serializer.attribute("", "id", book.getId()+"");

            serializer.startTag("", "name");
            serializer.text(book.getName());
            serializer.endTag("", "name");

            serializer.startTag("", "price");
            serializer.text(book.getPrice()+"");
            serializer.endTag("","price");

            serializer.endTag("", "book");

        }
        serializer.endTag("", "books");
        serializer.endDocument();

        return writer.toString();
    }

}

MainActivity.java(人机交互界面Activity)


package com.example.xml;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.examle.model.Book;
import com.example.parser.BookParser;
import com.example.parser.PullBookParser;

public class MainActivity extends Activity {
    private static final String TAG="XML";
    private BookParser parser;
    private List<Book> books;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button readBtn=(Button)findViewById(R.id.readbtn);
        Button writeBtn=(Button)findViewById(R.id.writebtn);

        readBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                try {
                    InputStream is=getAssets().open("book.xml");
                    parser=new PullBookParser();
                    books=parser.parse(is);
                    for(Book book:books){
                        Log.i(TAG,book.toString());
                    }

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        writeBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                try {
                    String xml=parser.serialize(books);
                    FileOutputStream fos=openFileOutput("book.xml",Context.MODE_PRIVATE);
                    fos.write(xml.getBytes("UTF-8"));
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    //Log.e(TAG, e.getMessage());
                }
            }
        });
    }
}


运行界面


运行结果
点击“read”时,读取book.xml文件中的数据

点击“write”时,将Book对象集合序列化后,返回xml格式的字符串,将字符串转化为xml格式的文件存入到设备内存中。如下图所示:data/data/包名/files/book.xml


这就完整实现了“读取数据”和“保存数据”

pull解析用到的主要的类和接口方法
读取到xml的声明返回 START_DOCUMENT;

读取到xml的结束返回 END_DOCUMENT ;

读取到xml的开始标签返回 START_TAG

读取到xml的结束标签返回 END_TAG

读取到xml的文本返回 TEXT

XmlPullParser:XML pull解析器是一个在XMLPULL VlAP1中提供了定义解析功能的接口。

XmlSerializer:它是一个接口,定义了XML信息集的序列。

XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。

XmlPullParserException:抛出单一的XML pull解析器相关的错误。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值