你好,游客 登录 注册 搜索
背景:
阅读新闻

Android使用XmlPullParser解析XML以及天气预报信息api使用

[日期:2014-03-06] 来源:Linux社区  作者:wangyishiwo [字体: ]

最近学校组织做实训,分到的任务是做Android的天气预报软件,我分到的任务是制作生活小贴士的部分。主要是关于空气质量、洗车指数一类的信息的显示,我使用的API是新浪天气的API,新浪天气的API提供的主要是XML文件。

新浪天气API的介绍我主要是参考http://www.linuxidc.com/Linux/2014-03/97743.htm,这个博客讲解的很细致,网络上关于新浪天气大多都跟这个博客的类似。


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文件示例如下:

<Students>

<Student>

<id>1001</id>

<name>zhangsan</name>

</Student>


<Student>

<id>1002</id>

<name>lisi</name>

</Student>

</Students>

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

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

// 循环语句进行遍历

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

{

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

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

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

// 你的代码

break;

case XmlPullParser.START_TAG:// START_TAG指一个标签的开始,即<id>和<name>

// 一般在这个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指一个标签的结束,即</id>和</name>

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。

更多Android相关信息见Android 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=11

linux
相关资讯       天气API  XmlPullParser 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款