Android中XML的解析--使用PULL

druidZ發表於2018-01-05

Android中XML的解析--使用PULL

一、用什麼解析XML

Android中一般有三種方式解析XML:Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附帶的pull解析器,這次我就來分享一下使用PULL解析器來解析XML。

二、解析辣鍋XML嘛

可以選擇在asset中建立個XML,也可以在res資料夾中新增,這裡我採用的第二種方法,在res中新建了一個xml資料夾,新增了個xml,//然後洗淨切絲備用。

Android中XML的解析--使用PULL
xml中就隨便寫了寫:

Android中XML的解析--使用PULL

三、開始解析

1.用啥子來解析呢?

開頭說了,我們使用pull解析器:XmlPullParser,不過使用這個需要pull的jar包,所以我們可以換一個:XmlResourceParser,這個是Android自帶的。

/**
 * The XML parsing interface returned for an XML resource.  This is a standard
 * XmlPullParser interface, as well as an extended AttributeSet interface and
 * an additional close() method on this interface for the client to indicate
 * when it is done reading the resource.
 */
public interface XmlResourceParser extends XmlPullParser, AttributeSet, AutoCloseable {
    /**
     * Close this interface to the resource.  Calls on the interface are no
     * longer value after this call.
     */
    public void close();
}
複製程式碼

可以看出來,XmlResourceParser繼承自XmlPullParser。

現在我們廚具(XmlResourceParser)有了,食材(XML檔案)也齊了,那麼可以直接上了麼?不過,是不是缺了個盤子來盛菜。

Android中XML的解析--使用PULL

2.準備個類來放解析出的資料

其實這步驟不做也可以(就著鍋來吃,那不是就成火鍋了麼),我這裡還是囉嗦一下,建立了Item類。

class Item {
        private String title;
        private int type;

        public Item() {
            title = " ";
            type = -1;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

        @Override
        public String toString() {
            return "title: " + title + " type: " + type;
        }
    }
複製程式碼

這個類沒什麼好說的(我重寫toString方法也就為了之後顯示結果方便點)。

3. 先看看食譜,怎麼解析的

解析的原理是:解析器(parser)讀取一個tag,解析後返回這個tag的eventType(有10種,之後說明),而我們通過判斷不同型別採取對應操作。

10種eventType
"START_DOCUMENT",
"END_DOCUMENT",
"START_TAG",
"END_TAG",
"TEXT",
"CDSECT",
"ENTITY_REF",
"IGNORABLE_WHITESPACE",
"PROCESSING_INSTRUCTION",
"COMMENT",
"DOCDECL"

我們可以重點關注這四個,START_DOCUMENT:xml文件的開頭,END_DOCUMENT文件結束標誌,START_TAG:tag開始標誌,比如<tabs>,END_TAG:tag結束標誌,比如</tabs>

多說無益,放碼過來

//parser.getEventType() 這句會丟擲異常,那我們就直接上拋異常吧
public List<Item> parse(XmlResourceParser parser) throws Exception {
        List<Item> items = null;
        Item item = null;
        //獲取事件型別
        int eventType = parser.getEventType();
        //不是檔案結尾就繼續迴圈
        while (eventType != XmlPullParser.END_DOCUMENT) {
            switch (eventType) {
                //遇到檔案開頭,這裡可以做一些初始化
                case XmlPullParser.START_DOCUMENT:
                    items = new ArrayList<>();
                    break;
                //碰到一個tag的開始,接下來通過getName看看這個tag是什麼
                case XmlPullParser.START_TAG:
                    if ("item".equals(parser.getName())) {
                        //這個tag是<item>
                        item = new Item();
                        //讀取item的第一個屬性:type
                        item.setType(Integer.parseInt(parser.getAttributeValue(0)));
                    } else if ("title".equals(parser.getName())) {
                        //這個tag是<title>,讀取tag內的內容
                        item.setTitle(parser.nextText());
                    }
                    break;
                //碰到tag的結尾
                case XmlPullParser.END_TAG:
                    if ("item".equals(parser.getName())) {
                        //表明這個結尾是</item>
                        items.add(item);
                        item = null;
                    }
                    break;
                default://寫個default,好習慣
                    break;
            }
            //結束,下一個
            eventType = parser.next();
        }

        return items;
    }
複製程式碼

4.準備就緒,解析吧

    List<Item> items;
    try {
        //我的xml放在了res中,所以用getResources來獲取,
        //放在asset中的就通過getAsset來獲取InputStream,
        //通過Xml.newPullParser()來獲取XmlPullParser,
        //XmlPullParser可以通過setInput(InputStream)來讀入xml檔案
        XmlResourceParser xmlparser = getResources().getXml(R.xml.tabs);
        items = parse(xmlparser);
        for (Item i : items) {
            Log.v("ParserXML", i.toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
        Log.v("testXML", e.toString());
    }
複製程式碼

O了個輪詢排程演算法K

//作為Android開發的初學者,如果我有錯誤的地方或者不足的話歡迎大家指正。希望與大家一同進步

Android中XML的解析--使用PULL

相關文章