使用Pull解析XML

1.Pull解析简介
Pull是Android内置的xml解析器。Pull解析器的运行方式与SAX 解析器相似。Pull解析是一种流式解析,边读取边解析.从一个xml文档自上往下进行读取.Pull解析是一种基于事件模型的一种解析,一旦遇到一种事件就会交给程序员去处理这种事件.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的字符串值。

2.下面举一个例子来使用pull解析xml

2.1 首先准备要解析的xml文档,这里我们放到android项目的assets目录下.取名为books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book language="中文">
        <isbn>ISBN-1234-5678-1111</isbn>
        <name>小李飞刀</name>
        <price>100.0</price>
        <author>FioMan</author>
        <publish>Tarena国际出版社</publish>
        <decription>
            <![CDATA[    简介:
           (##$%^^&@@####$$$$%%%%%%) <> <>
           阿斯顿发斯蒂芬阿萨发送的飞asd发射的飞                 
           asdjflasdjfasdfjasdjfasjdfjffff
           发到手机费拉sdk就飞拉萨的减肥
           $%^^#%#%^#^#^#^##^#^   ]]>
        </decription>
    </book>

    <book language="英文">
        <isbn>ISBN-1234-5678-2222</isbn>
        <name>东方不败</name>
        <price>&lt;100.0&gt;50.0</price>
        <author>FioMan</author>
        <publish>Tarena国际出版社</publish>
    </book>

    <book language="日文">
        <isbn>ISBN-1234-5678-3333</isbn>
        <name>挪威的森林</name>
        <price>99.0</price>
        <author>村上村树</author>
        <publish>Tarena国际出版社</publish>
    </book>

    <book language="法语">
        <isbn>ISBN-1234-5678-4444</isbn>
        <name>只有努力才能看起来毫不费力</name>
        <price>99.0</price>
        <author>FioMan</author>
        <publish>Tarena国际出版社</publish>
    </book>

</books>

2.2 在项目中创建一个实体类Book用于存放book标签的元素.
Book.java 如下:

public class Book
{
    private String name;
    private String author;
    private String price;
    private String isbn;
    private String description;
    private String publish;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getAuthor()
    {
        return author;
    }
    public void setAuthor(String author)
    {
        this.author = author;
    }
    public String getPrice()
    {
        return price;
    }
    public void setPrice(String price)
    {
        this.price = price;
    }
    public String getIsbn()
    {
        return isbn;
    }
    public void setIsbn(String isbn)
    {
        this.isbn = isbn;
    }
    public String getDescription()
    {
        return description;
    }
    public void setDescription(String description)
    {
        this.description = description;
    }
    public String getPublish()
    {
        return publish;
    }
    public void setPublish(String publish)
    {
        this.publish = publish;
    }
    @Override
    public String toString()
    {
        return "Book [name=" + name + ", author=" + author + ", price=" + price
        + ", isbn=" + isbn + ", description=" + description+ ", publish=" + publish + "]";
    }
}

2.3在android项目中加入一个点击按钮btn_pull,点击之后使用Pull解析刚才的books.xml.
代码如下:
首先说下Pull解析的流程:
1>首先是获取XmlPullParser解析器对象.有两种方式:
1.1>直接使用Xml类的静态方法newPullParser()方法获取XmlPullParser对象.
XmlPullParser parser = Xml.newPullParser();
1.2>使用解析器工厂的方式
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();

2>给解析器设置输入流.因为这个例子里面用的是assets里面的原生资源.所以我们这里是这样设置的.
InputStream is = getAssets().open(“books.xml”);
parser.setInput(is,”utf-8”);

3>配置while循环根据事件类型边驱动事件边解析XML.
首先是获取事件类型
int event = parser.getEventType();
while(event != XmlPullParser.END_DOCUMENT)
{
switch(event)
{
case XmlPullParser.START_DOCUMENT: //文档开始
case XmlPullParser.START_TAG://开始标签
case XmlPullParser.END_TAG://结束标签
}
//手动触发事件
event = parser.next();
}
下面是整个的解析代码,然后通过log打印.

private void parseXML_PULL() throws Exception
    {
        //1.XmlPullParser
        XmlPullParser parser = Xml.newPullParser();
        InputStream is = getAssets().open("books.xml");
        //2.设置xml输入流
        parser.setInput(is ,"utf-8");
        //3.获取事件,配合while循环开始解析xml文件
        int event = parser.getEventType();
        List<Book> books = new ArrayList<Book> ();
        Book book = null;
        while(event != XmlPullParser.END_DOCUMENT)
        {
            switch(event)
            {
                case XmlPullParser.START_DOCUMENT:
                    break;
                case XmlPullParser.START_TAG:
                    String tagName = parser.getName();
                    if("book".equals(tagName))
                    {
                        book = new Book();
                        books.add(book);
                    }
                    else if("isbn".equals(tagName))
                    {
                        book.setIsbn(parser.nextText());
                    }
                    else if("name".equals(tagName))
                    {
                        book.setName(parser.nextText());
                    }
                    else if("price".equals(tagName))
                    {
                        book.setPrice(parser.nextText());
                    }
                    else if("author".equals(tagName))
                    {
                        book.setAuthor(parser.nextText());
                    }
                    else if("publish".equals(tagName))
                    {
                        book.setPublish(parser.nextText());
                    }
                    else if("decription".equals(tagName))
                    {
                        book.setDescription(parser.nextText());
                    }
                    break;
            }

            //手动出发下一个事件
            event = parser.next();
        }

        for(Book b : books)
        {
            Log.d("toLook", b.toString());
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值