Android-xml解析之PULL解析

原创 2015年11月18日 03:00:10

pull解析xml记录

这里现在要解析的xml

  • 以下是一个天气的xml数据
  • 其中有部分省略
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<root>
<resultcode>200</resultcode>
<reason>successed!</reason>
<result>
<sk>...</sk>
<today>
<temperature>13℃~18℃</temperature>
<weather>阴转多云</weather>
<weather_id>...</weather_id>
<wind>微风</wind>
<week>星期三</week>
<city>成都</city>
<date_y>20151118日</date_y>
<dressing_index>较舒适</dressing_index>
<dressing_advice>建议着薄外套、开衫牛仔衫裤等服装。年老体弱者应适当添加衣物,宜着夹克衫、薄毛衣等。</dressing_advice>
<uv_index>最弱</uv_index>
<comfort_index/>
<wash_index>不宜</wash_index>
<travel_index>较适宜</travel_index>
<exercise_index>较适宜</exercise_index>
<drying_index/>
</today>
<future>
<item>
<temperature>13℃~18℃</temperature>
<weather>阴转多云</weather>
<weather_id>
<fa>02</fa>
<fb>01</fb>
</weather_id>
<wind>微风</wind>
<week>星期三</week>
<date>20151118</date>
</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
</future>
</result>
<error_code>0</error_code>
</root>

以下是解析步骤

传入一个xml文件的输入流

/**
     * xml之pull解析
     */
    public static String changeXML(InputStream in)
    {
        StringBuilder sb = new StringBuilder();

实例化一个XmlPullParser解析器,注意Xml是在android.util包中的

        XmlPullParser parser = Xml.newPullParser();
        try
        {

将要解析的文件流或者文件字符流放入解析器中,设置流格式,一般都是utf-8

            parser.setInput(in, "utf-8");

得到事件类型

  • 类型这里用到了
    • 文档开始类型:XmlPullParser.START_DOCUMENT
    • 文档结束类型:XmlPullParser.END_DOCUMENT
    • 开始标签类型:XmlPullParser.START_TAG
    • 结束标签类型:XmlPullParser.END_TAG
    • 如图:
      这里写图片描述
  • 通过判断事件类型,我们可以知道当前处于什么地方
            int eventType = parser.getEventType();
  • 这个解析是从头一步步往下解析的,直到文档结束
            while (eventType != XmlPullParser.END_DOCUMENT)
            {
  • 获得当前标签名
                String currentTagName = parser.getName();
                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    break;
                //如果是开始标签类型则执行下面的部分
                case XmlPullParser.START_TAG:
                    //如果上边得到的标签名等于resultcode
                    if(currentTagName.equals("resultcode"))
                    {
                    //则获取标签之后的字符
                        sb.append(parser.nextText() + "\n");
                    }
  • 以下都差不多
  • 但要注意了其中可能有相同标签套着的
  • eventType = parser.next();是跳到下一个开始标签或结束标签
                    if(currentTagName.equals("reason"))
                    {
                        sb.append(parser.nextText() + "\n");
                    }
                    if(currentTagName.equals("temp"))
                    {
                        sb.append(parser.nextText() + "\n");
                    }
                    if(currentTagName.equals("wind_direction"))
                    {
                        sb.append(parser.nextText() + "\n");
                    }
                    if(currentTagName.equals("wind_strength"))
                    {
                        sb.append(parser.nextText() + "\n");
                    }
                    if(currentTagName.equals("humidity"))
                    {
                        sb.append(parser.nextText() + "\n");
                    }
                    if(currentTagName.equals("time"))
                    {
                        sb.append(parser.nextText() + "\n");
                    }
                    if(currentTagName.equals("today"))
                    {
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");

                        eventType = parser.next();
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                        eventType = parser.next();
                        while(!(eventType == XmlPullParser.END_TAG && currentTagName.equals("today")))
                        {
                            sb.append(parser.nextText() + "\n");
                            eventType = parser.next();
                        }
                        currentTagName = parser.getName();
                    }
                    Log.i("myout", "currentTagName = " +currentTagName);
                    if(currentTagName.equals("item"))
                    {
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                        sb.append(parser.nextText() + "\n");
                        eventType = parser.next();
                    }
                    break;
                case XmlPullParser.END_TAG:

                    break;
                default:
                    break;
                }

获取下一个事件类型

                eventType = parser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }

        return sb.toString();
    }

运行效果图

  • 以下是用一个TextView显示了BufferBuilder对象的最终结果
  • TextView放在了一个ScrollView中以便滑动,布局就不给出了
    这里写图片描述

我的感受

  • pull解析xml就是一步步一层层的向下解析
  • 其中遇到个问题,就是数据老是只能解析一小半。最后才发现,原来就在那小半的最后那里我少往下走了一步(指少写了一个eventType = parser.next();),╮(╯▽╰)╭

想说的话

  • 博客坚持写,不管怎样,今后学习了新的东西就在这里记录一下,以便今后回顾,也希望小小笔记能帮助你们
  • 如果内容有什么地方不对,望吐槽,希望大家能一起学习和成长
  • 来一句:尊重他人、耐心、礼遇每一个人
版权声明:本文为博主原创文章,未经博主允许不得转载。

XML使用SAX解析与PULL解析的区别

XML使用SAX解析与PULL解析的区别在最近的应用中,经常会用到对XML的解析,但是一直有一个疑问就是SAX解析与PULL解析的区别到底是什么。搜索了相关的问题,整理如下,以便大家查询。我们知道,S...
  • zhliro
  • zhliro
  • 2015年07月10日 15:18
  • 1909

浅析PULL解析

浅析PULL解析1. 基本介绍PULL方式解析XML是在Android中极力推荐使用的一种解析XML的方式,但PULL解析除了在Android中可以使用外,在JavaSE中仍然可以使用。在JavaSE...
  • zhliro
  • zhliro
  • 2015年07月10日 13:54
  • 2368

Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别

XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。今天就由我向大家介绍一下在Android平台下几种常见的XML解...
  • cangchen
  • cangchen
  • 2015年03月03日 10:17
  • 3624

XML解析(三),PULL解析XML

昨天写了【XML解析(一)】SAX解析XML 和【XML解析(二)】DOM解析XML两篇文章,有兴趣的朋友可以去看一下,今天我们来学习一下PULL解析XML,刚好可以跟SAX和DOC解析XML的两种方...
  • ydxlt
  • ydxlt
  • 2015年12月06日 08:52
  • 9011

利用Dom,Sax,Pull三种方式解析xml文件

最近找工作,看到许多公司的要求里都写了要会xml解析,所以就把之前的xml解析知识又重新回顾了一下,写个小例子. 解析xml文件常用的几种方式也就dom,sax,pull了,并且面试官经常问到的也是这...
  • qiang_xi
  • qiang_xi
  • 2015年11月29日 20:15
  • 1149

Android解析XML方式(二)使用PULL解析XML

在前一篇中介绍了使用SAX解析XML,本篇来讲一下如何使用JAVA自带的PULL来解析XML数据,以及它们的各自优点在哪里。 首先来看一下什么是PULL解析器以及它的基本特征: PULL解析器的运...
  • wulianghuan
  • wulianghuan
  • 2013年02月26日 21:23
  • 4260

android之Xml的高效解析方式——pull

我们知道,解析XML在各个平台使用也非常广泛,android也是一样,经常会涉及到XML的解析读取,解析方式主要有三种:SAX解析器、DOM解析器和PULL解析器。 SAX解析器:它的核心是事件处理...
  • qq_21983189
  • qq_21983189
  • 2017年02月14日 12:09
  • 678

《第一行代码》第十章-Pull解析方式

起因是自己在实际操作的过程中在这一节卡住了,因为此书是2014年的,有些地方难免与现在有些不一样。而这些正好能祛除我的浮躁。 工具:Android Studio 2.2.2 网络上传输数据时...
  • a1b2c300
  • a1b2c300
  • 2016年12月22日 01:44
  • 284

【Android】实现XML解析的几种技术

常见的XML解析器分别为DOM解析器、SAX解析器和PULL解析器 第一种方式:DOM解析器:     DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检...
  • yinianjian2017
  • yinianjian2017
  • 2017年03月28日 11:46
  • 131

XML概述以及Pull解析详解

XML概述以及Pull解析详解 ONE Goal ,ONE Passion ! 做Android开发最多的都是json.而且解析xml都用Xstream,慢慢地xml的手动解析都快忘记了.概述:XML...
  • fengltxx
  • fengltxx
  • 2016年06月26日 20:07
  • 1412
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-xml解析之PULL解析
举报原因:
原因补充:

(最多只允许输入30个字)