使用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 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章