XML解析之Pull解析

在安卓中最常用的解析方式应该是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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值