Android XmlPullParser解析xml文件时type值的变化

xml文件名为get_data.xml,文件内容如下:

 <apps>
    <app>
        <id>1</id>
        <name>Google Maps</name>
        <version>1.0</version>
    </app>
    <app>
        <id>2</id>
        <name>Chrome</name>
        <version>2.1</version>
    </app>
    <app>
        <id>3</id>
        <name>Google Play</name>
        <version>2.3</version>
    </app>
</apps>

MainActivity中解析类代码(XmlPullParser):

  //创建工厂
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        //创建解析器
        XmlPullParser parser = factory.newPullParser();
        //创建输入流
        InputStream is = new FileInputStream("src/get_data.xml");
        //将文件写入到解析器
        parser.setInput(is, "utf-8");

        //创建集合
        ArrayList<Data> list = null;
        //创建Data对象
        Data data= null;

        int type = 0;

        //循环读取每行数据
        while((type = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
            //获取标签的姓名
            String tagName = parser.getName();

            //判断是开始标签还是结束标签
            switch (type) {
            case XmlPullParser.START_TAG:
                //如果开始时apps就创建list对象
                if("apps".equals(tagName)) {
                    list = new ArrayList<Student>();
                }else if("app".equals(tagName)) {
                    //如果开始标签是app就创建data对象
                    data= new Data();
                 }else if("id".equals(tagName)) {
                    //如果开始标签是id就获取获取id的值
                    String id= parser.nextText();
                    //把id的值赋给data对象
                    data.setId(id);    
                }else if("name".equals(tagName)) {
                    //如果开始标签是name就获取获取name的值
                    String name = parser.nextText();
                    //把name的值赋给data对象
                    data.setName(name);
                }else if("version".equals(tagName)) {
                    //如果开始标签是version就获取获取version的值
                    String version= parser.nextText();
                    //把version的值赋给data对象
                    data.setVersion(version);
                }
                break;

            case XmlPullParser.END_TAG:
                //如果结束标签是app就将app对象加入到list集合中
                if("app".equals(tagName)) {
                    list.add(data);
                }
                break;
            }
            //执行下一行
            parser.next();
        }

        //遍历list集合
        for (Data data: list) {
            System.out.println(data);
        }
    }

**开始关于type的值我有一些疑问,于是使用了断点调试.发现第一次进入时type是0,获取的应该是START_DOCUMENT,tagName为null;第二次进入时type就为2了,此时获取的应该是students开始标签即START_TAG,tagName为students;第三次进入时type就为4了,此时获取的应该是空格,在解析的时候会把空格当作一个文本节点,4就代表文本节点tagName为null;以后只要是开始标签type就一直为2,是文本节点就一直为4;当遇到student结束标签是type就变成3了,也就是END_TAG.
所以根据上面的规律,我发现getEventType()返回值的类型是Int,根据Int值可以分别看出对应的是什么类型的标签:
START_DOCUMENT = 0;
END_DOCUMENT = 1;
START_TAG = 2;
END_TAG = 3;
文本节点 = 4;

猜你喜欢

转载自blog.csdn.net/Shelly_Shuang/article/details/82656977