XML解析之Pull解析

来源:互联网 发布:古兰经软件30本 编辑:程序博客网 时间:2024/04/29 16:18

在安卓中最常用的解析方式应该是pull解析,它自身比较方便,可以灵活控制读取节点的开始和停止。

那么具体怎么用pull来解析xml文档呢?

首先我们来看一个比较简单的xml文件是什么样的:
如下:名字为book.xml的文档

<?xml version="1.0" encoding="utf-8"?><resources>    <book id="1">        <name>java</name>        <price>20</price>    </book>    <book id="2">        <name>android</name>        <price>30</price>    </book></resources>

我们可以看到这个名字叫book.xml的文档最上面有一个声明语句

这句话呢就对应着解析文档的开始。

那么我们最终能够解析出来一个什么样子的东西,才叫xml的解析呢?
就以上xml,我希望能够解析出一本书的名字和价格,就可以了,其他的都不重要。
好了,开始解析。

一、新建一个Book类用来存放解析出的数据

public class Book {    String name;    String price;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPrice() {        return price;    }    public void setPrice(String price) {        this.price = price;    }    @Override    public String toString() {        return "name:"+name+"\n"+"price"+price;    }}

二、建立一个接口,接口中包含解析的方法

public interface PullParser {    /**     *     * 解析输入流,获取Beauty列表     * @param is     * @return     * @throws Exception     */    public List<Book> parse(InputStream is) throws Exception;    /**     *     * 序列化Beauty对象集合,得到XML形式的字符串     * @param beauties     * @return     * @throws Exception     */    public String serialize(List<Book> beauties) throws Exception;}

三、建立解析类,继承自接口(目的是封装解析的方法)

public class ParserXml implements PullParser {    List<Book> books;    Book book;    @Override    public List<Book> parse(InputStream is) throws Exception {        // 由android.util.Xml创建一个XmlPullParser实例        XmlPullParser xpp = Xml.newPullParser();        // 设置输入流 并指明编码方式        xpp.setInput(is,"UTF-8");        //获取标签的类型         int eventType=xpp.getEventType();        while(eventType!=XmlPullParser.END_DOCUMENT){            switch (eventType){                //判断是否为文档开始                case XmlPullParser.START_DOCUMENT:                    //初始化list集合                     books=new ArrayList<>();                    break;                case XmlPullParser.START_TAG:                      if(xpp.getName().equals("book")){//判断开始标签是否为book                        book=new Book();                        eventType=xpp.next();                    }else if(xpp.getName().equals("name")){                        eventType=xpp.next();//让evenType指向name的下一个标签                        book.setName(xpp.getText());                    }else if(xpp.getName().equals("price")){                        eventType=xpp.next();                        book.setPrice(xpp.getText());                    }                    break;                //判断当前标签是否为文件结束标签                case XmlPullParser.END_TAG:                    if(xpp.getName().equals("book")){                        books.add(book);//将book存入list集合                    }                    break;            }            eventType=xpp.next();        }        return books;    }    @Override    public String serialize(List<Book> beauties) throws Exception {        return null;    }}

四、最后在Mainactivity中获取xml文件并调用解析方法

       mlist=new ArrayList<>();                xml=new ParserXml();                try {                    mlist=xml.parse(is);                    mTextView.setText(mlist.toString());                } catch (Exception e) {                    e.printStackTrace();                }
0 0
原创粉丝点击