Android-xml解析之PULL解析
2015-11-18 03:00
465 查看
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>2015年11月18日</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();),╮(╯▽╰)╭
想说的话
博客坚持写,不管怎样,今后学习了新的东西就在这里记录一下,以便今后回顾,也希望小小笔记能帮助你们如果内容有什么地方不对,望吐槽,希望大家能一起学习和成长
来一句:尊重他人、耐心、礼遇每一个人
相关文章推荐
- 记Android外置存储区的坑
- Android-JSON解析
- [置顶] 【Android】双击返回键,退出android应用程序 双击两次退出程序提示功能 三种实现方法
- android之仿微博Textview的伸缩效果,判断超过行后才会出现伸展收缩,否则隐藏伸展效果
- Android开发——ViewPager、项目相关
- Android有未接来电后处理(判断未接来电)
- Android蓝牙开发的一些经验
- AndroidStudio 编译错误
- Android各种小技巧(持续更新)
- Android 5.0之后如何获取topStack
- Android 开发之如何屏幕返回键
- Android开发如何让activity不出现在最近列表中
- android文件的写入与读取---简单的文本读写
- Android的计时组件Chronometer类简单使用
- android 自动化测试
- android 编译常用命令
- android --- fastboot 协议学习
- Android学习之Drawable资源
- Android接口初了解
- Android5.0以上版本ActiveAndroid报ClassNotFoundException错误