天天看点

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是做什么的