天天看點

XML解析之pull解析

什麼是pull解析

——- pull解析xml檔案,和sax和dom一樣 都可以脫離android單獨使用,pull和sax的原理一樣,不一樣的地方是pull讀取xml檔案後調用方法傳回的是數字

  • xml的聲明傳回數字0: START_DOCUMENT
  • xml的結束傳回數字1: END_DOCUMENT
  • xml的開始标簽傳回數字2: START_TAG
  • xml的結束标簽傳回數字3: END_TAG
  • xml的文本傳回數字4: TEXT

    說明了pull每個辨別都是事件,它采用的就是事件驅動

直接上代碼 :

對下面這個xml進行pull解析

<?xml version="1.0" encoding="utf-8"?>
<PlayList>
  <media id = "0" day = "00">
    <type>0</type>
    <name>江南</name>
    <path>E:\dotnet\TestWinApp\TestWinApp\music\江南.mp3</path> 
 </media>
  <media id = "1" day = "11">
    <type>1</type>
    <name>新不了情-015</name>
    <path>F:\電視劇\新不了情\新不了情-015.rmvb</path>
  </media>
  <media id = "2"  day = "22">
    <type>2</type>
    <name>新不了情-016</name>
    <path>F:\電視劇\新不了情\新不了情-016.rmvb</path>
  </media>
</PlayList>
           

可以看到,我們對javaBean來進行儲存

先建立一個play.java對象

public class Play {

    private int id;
    private int day;
    private String name;
    private int type;
    private String path;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getType() {
        return type;
    }

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

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    @Override
    public String toString() {
        return "Play{" +
                "id=" + id +
                ", day=" + day +
                ", name='" + name + '\'' +
                ", type=" + type +
                ", path='" + path + '\'' +
                '}';
    } //重寫toString 是為了列印驗證的
}
           

解析步驟:

1. 建立pull工廠類

2. 通過工廠類,建立pull解析器

3. 設定xml檔案來源,也可以設定編碼

4. 進行事件一個一個分析

5. 在分析的過程中,進行對bean對象建立

6. 列印驗證

private static void xmlPullParserDemo() {

        List<Play> list  = null;
        try {
        //建立pull工廠類 并 建立解析器,鍊式程式設計
            XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();
            //設定檔案來源,也可以設定編碼
            pullParser.setInput(new FileReader("E:\\CodeDemo\\HttpUrlConnection\\paly.xml"));
            int type = pullParser.getEventType();
            Play p = null;
            //進行事件一個一個分析
            while (type != XmlPullParser.END_DOCUMENT) {
                String nodeName = pullParser.getName();
                switch (type) {
                    case XmlPullParser.START_DOCUMENT:
                        list = new ArrayList<>();
                        break;

                    case XmlPullParser.START_TAG:
                    {
                        switch (nodeName) {
                            case "media":
                                p = new Play();
                                int count = pullParser.getAttributeCount();
                                for (int i = ; i < count; i++) {
                                    String name = pullParser.getAttributeName(i);
                                    String value = pullParser.getAttributeValue(i);
                                    if(name.equals("id")) {
                                        p.setId(Integer.parseInt(value));
                                    } else {
                                        p.setDay(Integer.parseInt(value));
                                    }
                                }
                                break;
                            case "type":
                                p.setType(Integer.parseInt(pullParser.nextText()));
                                break;
                            case "name":
                                p.setName(pullParser.nextText());
                                break;
                            case "path":
                                p.setPath(pullParser.nextText());
                                break;
                        }
                    } break;
                    case XmlPullParser.END_TAG:
                        if (nodeName.equals("media")) {
                            list.add(p);
                        }
                        break;

                }
                //在分析的過程中,進行對bean對象建立
                type = pullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (int i = ; i < list.size(); i++) {
            System.out.println(list.get(i));
            //列印驗證
        }
    }
           

注意:

1. int type = pullParser.getEventType(); 這個是獲得事件類型,要不停的後移,别忘記 type = pullParser.next();

2. String nodeName = pullParser.getName(); 是擷取節點名,僅僅是擷取名,不是值

3. 這個是pullParser.nextText()擷取值的,而不是getText();

4. 最後一個,别忘記了,文章開始的那幾個tag, 0,1,2是做什麼的