设为首页 加入收藏

TOP

Android使用XmlPullParser解析XML以及天气预报信息api使用
2014-11-24 01:04:07 来源: 作者: 【 】 浏览:3
Tags:Android 使用 XmlPullParser 解析 XML 以及 天气预报 信息 api


API接口如下:


http://php.weather.sina.com.cn/xml.php city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0



其中,city后的城市转码。


Password固定


Day为0表示当天天气,1表示第二天的天气,2表示第三天的天气,以此类推,最大为4。


city后的城市转码这句很笼统,为难了我一阵,在这里分享一下,这个转码需要使用GB2312来转换,就是类似


String city = java.net.URLEncoder.encode("北京","gb2312");


这样就可以直接转为我们需要的城市的转码。



接下来是关于解析XML文件,我使用的是XmlPullParser的方法解析。


1. 实例化一个XML解析器XmlPullParser


2. 给实例化的XML解析器所需要的xml资源


如:XmlPullParser parser = Xml.newPullParser();


parser.setInput(is, "UTF-8");


(is是从网络上获取的InputStream的字符流)


以上,XML解析器就获取了需要解析的XML文件。


接下来就是要解析获取的XML数据。


1. 得到XML标签


2. 通过循环语句对标签进行遍历获取想要的数据


例如:XML文件示例如下:




1001


zhangsan





1002


lisi




上面的解析器得到xml数据之后,解析的过程如下:


int type = parser.getEventType(); // 得到xml数据的标签


// 循环语句进行遍历


while(type != parser.END_DOCUMENT) // 在xml的标签不为结束标签时进行遍历,就是上面的标签


{


switch(type){// 判断标签类型,这个标签的数值我们可以从Android导入的包中查询到,以下提供一些常用的


// START_DOCUMENT:0END_DOCUMENT:1 START_TAG:2END_TAG:3 TEXT:4


case XmlPullParser.START_DOCUMENT: // START_DOCUMENT指一个实例的的开始标签,即


// 你的代码


break;


case XmlPullParser.START_TAG:// START_TAG指一个标签的开始,即


// 一般在这个case中获取数据, 例如:


String name = parser.getName();// 获取标签标题


if(name.equals("id"))


{


System.out.println(parser.nextText());// parser.nextText()这个语句表示获取标签中的内容


}



if(name.equals("name"))


{


System.out.println(parser.nextText());


}


break;
case XmlPullParser.END_TAG:// END_TAG指一个标签的结束,即和


break;


}


parser.next();// 解析器移向下一个标签


type = parser.getEventType();// 获取标签类型


}


这样一个xml就解析结束了。




以下是我今天出现的BUG以及调试的结果,与君共勉。


BUG1:我在每一个case里向两个数据包里传递了数据,都是使用的parser.nextText()语句进行获取数据并传递。


只有第一个数据包接收到了第一个数据,其他数据都没有显示。


这个BUG我调试了一个下午才发现问题,所以一定要记录下来。


问题就在于parser.nextText()不能连续对一个标签使用两次。在发现问题之后,我对XmlPullParser的理解是,这个类实例化之后是个类似于指针的东西,这个东西只能向下运动和读取数据,因此我执行的第二次parser.nextText()操作使这个指针指向了一个未知的地方。


因此我们需要使用该数据时,可以先String temp = parser.nextText();然后可以多次调用temp这个变量。


BUG2:我们再解析数据的之后,很多时候是要把数据放入ListView控件中,但是很多时候他人为我们提供的XML文件的顺序是乱的。


(当然JSON数据不会出现这种解析乱掉的问题,所以如果有JSON数据的接口还是比较建议使用JSON数据)


下面我举个例子:例如我需要最近3天的天气信息和温度信息,而接口中提供的XML文件是3天的天气信息放在前3行,3天的温度信息放在后3行,当我们需要使用HashMap类的3个map实例来获取信息并放入ArrayList时就无法像很多的例子中那样直接使用循环,一个map里应该放入一个天气信息和一个温度信息,但是一个在第1遍循环,一个在第4遍循环,会造成map放入list的混乱。


这种问题我提供一下我的解决方法,并不是最好的甚至有些麻烦,如果各位看官有更好的方法欢迎一同交流。


我的解决方法是,我建立了一个Data类,将所有我需要的数据放置进去,里边有get()和set()的函数,当其他人需要相关信息的时候,可以直接将这个实例化的变量传递出去。同时为了方便建立适配器,我还根据我的数据需要建立了一个二维的String数组,在解析的同时将数据同时放入数组中。


例如:String[][] weather = new String[3][2];final int DAY_ONE = 0; final int DAY_TWO = 1; final int DAY_THREE = 2; final int STATUS = 0; final int TEM = 2;


定义这些全局变量方便以将数据放入数组。这样我们在建立ArrayList的时候就可以使用循环来创建map并将之放入ArrayList。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Objective-C中@property的所有属.. 下一篇iOS入门教程之打开照相机与本地相..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: