完美解析Google weather API,得到天气信息并显示详细代码

在实现中用到的一些方法,再此文中可以找到:完美解析Google weather API,得到天气信息并显示:http://blog.csdn.net/zyc851224/article/details/7383689




1、首先要明白我们需要解析XML文件,而且我们使用的是SAX的方式。第一步我们可以基于single-view来创建一个工程,(这里使用的是xcode4.2),添加代理:

#import <UIKit/UIKit.h> @class ViewController; @interface AppDelegate : UIResponder <UIApplicationDelegate,NSXMLParserDelegate>//添加XMLParser代理 @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) ViewController *viewController; @end
2、完成后在viewController.h文件中声明我们需要的各种控件和变量。我是这么声明的:

#import <UIKit/UIKit.h> @interface ViewController : UIViewController{ //保存解析结果的可变数组 NSMutableArray *arryDataMutable; //NSMutableArray *tempData; //天气图片显示view UIImageView *iocnImage; UIImageView *iconImage1; UIImageView *iconImage2; UIImageView *iconImage3; UIImageView *iconImage4; //UIImageView *iconImage5; //UIImageView *iconImage6; //当日天气基本信息显示文本框 IBOutlet UILabel *cityLable; //城市 IBOutlet UILabel *forecast_dateLable;//日期 IBOutlet UILabel *conditionLable; //天气情况 IBOutlet UILabel *temp_fLable; //华氏温度 IBOutlet UILabel *temp_cLable; //摄氏温度 IBOutlet UILabel *humidityLable; //湿度 IBOutlet UILabel *wind_conditionLable; //风信息 //往后几日天气信息显示文本框 IBOutlet UILabel *day_of_weekcLable1; IBOutlet UILabel *day_of_weekcLable2; IBOutlet UILabel *day_of_weekcLable3; IBOutlet UILabel *day_of_weekcLable4; //IBOutlet UILabel *day_of_weekcLable5; //解析出的时间日期显示文本框 IBOutlet UILabel *datetimeLabel; //可变数组大小存储变量 int arrySizInt; //UITableView *tableView; } @property (nonatomic, retain)IBOutlet UILabel *cityLable; @property (nonatomic, retain)IBOutlet UILabel *forecast_dateLable; @property (nonatomic, retain)IBOutlet UILabel *conditionLable; @property (nonatomic, retain)IBOutlet UILabel *temp_fLable; @property (nonatomic, retain)IBOutlet UILabel *temp_cLable; @property (nonatomic, retain)IBOutlet UILabel *humidityLable; @property (nonatomic, retain)IBOutlet UILabel *wind_conditionLable; @property(nonatomic ,retain) NSMutableArray *arryDataMutable; @property (nonatomic,retain)IBOutlet UIImageView *iconImage; @property (nonatomic,retain)IBOutlet UIImageView *iconImage1; @property (nonatomic,retain)IBOutlet UIImageView *iconImage2; @property (nonatomic,retain)IBOutlet UIImageView *iconImage3; @property (nonatomic,retain)IBOutlet UIImageView *iconImage4; //@property (nonatomic,retain)IBOutlet UIImageView *iconImage5; //@property (nonatomic,retain)IBOutlet UIImageView *iconImage6; //@property (nonatomic, retain) NSMutableArray *tempData; @property (nonatomic,retain)IBOutlet UILabel *day_of_weekcLable1; @property (nonatomic,retain)IBOutlet UILabel *day_of_weekcLable2; @property (nonatomic,retain)IBOutlet UILabel *day_of_weekcLable3; @property (nonatomic,retain)IBOutlet UILabel *day_of_weekcLable4; //@property (nonatomic,retain)IBOutlet UILabel *day_of_weekcLable5; @property (nonatomic,retain)IBOutlet UILabel *datetimeLabel; @property int arrySizInt; //@property (nonatomic, retain)IBOutlet UITableView *tableView; @end
3、完成后我们在viewController.m文件里进行主要的操作和实现。

首先我们要获取 api 的地址,我获取的地址是:

http://www.google.co.uk/ig/api?weather=Beijing,为了便于以后操作,我们定义一个变量来保存城市名称。

然后再对具体的信息进行解析存储并显示,主要代码如下:

-(IBAction) GetLocalWeather { //位置定位,可在界面设置用户选择或者查询或者输入来获取 NSString *location = @"Beijing"; //api地址前缀 NSString *address = @"http://www.google.co.uk/ig/api?weather="; //合成实际的访问地址 NSString *request = [NSString stringWithFormat:@"%@%@&hl=zh_CN&oe=UTF-8",address,location]; //声明URL进行地址访问 NSURL *URL = [NSURL URLWithString:request]; NSError *error; //获取XML文件,如果编码格式不是UTF-8,需要对网页进行转码 NSString *XML = [NSString stringWithContentsOfURL:URL encoding:NSUTF8StringEncoding error:&error]; //NSLog(@"XML: %@", XML); /***************使用分段方法对xml前半部分进行解析************/ // 温度获取 摄氏 NSString *tempInC = [[[[XML componentsSeparatedByString:@"temp_c data=\""] objectAtIndex:1] componentsSeparatedByString:@"\""] objectAtIndex:0]; // 温度获取 华氏 NSString *tempInF = [[[[XML componentsSeparatedByString:@"temp_f data=\""] objectAtIndex:1] componentsSeparatedByString:@"\""] objectAtIndex:0]; // 城市获取 NSString *city = [[[[XML componentsSeparatedByString:@"postal_code data=\""] objectAtIndex:1] componentsSeparatedByString:@"\""] objectAtIndex:0]; // 日期获取 NSString *date = [[[[XML componentsSeparatedByString:@"forecast_date data=\""]objectAtIndex:1]componentsSeparatedByString:@"\""]objectAtIndex:0]; // 天气获取 NSString *condition = [[[[XML componentsSeparatedByString:@"condition data=\""] objectAtIndex:1] componentsSeparatedByString:@"\""] objectAtIndex:0]; // 湿度获取 NSString *humidity = [[[[XML componentsSeparatedByString:@"humidity data=\""] objectAtIndex:1] componentsSeparatedByString:@"\""] objectAtIndex:0]; // 风信息获取 NSString *wind = [[[[XML componentsSeparatedByString:@"wind_condition data=\""] objectAtIndex:1] componentsSeparatedByString:@"\""] objectAtIndex:0]; // 天气图片获取,需要获取图片的实际地址,获取后存放在NSData中 NSString *icon = [[[[XML componentsSeparatedByString:@"icon data=\""]objectAtIndex:1]componentsSeparatedByString:@"\""]objectAtIndex:0]; iconImage.image=nil; NSString* path =[NSString stringWithFormat: @"http://www.google.co.uk%@",icon]; NSURL* url = [NSURL URLWithString:[path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];//网络图片url NSData* data = [NSData dataWithContentsOfURL:url];//获取网络图片数据 arryDataMutable = [[NSMutableArray alloc] init]; //打印输出 cityLable.text = city; forecast_dateLable.text = date; conditionLable.text = condition; humidityLable.text = humidity; wind_conditionLable.text = wind; temp_fLable.text = tempInF; temp_cLable.text = tempInC; //对图片进行圆角处理并显示 CALayer *layer = [iconImage layer]; [layer setMasksToBounds:YES]; [layer setCornerRadius:5.0]; [layer setBorderWidth:1.0]; [layer setBorderColor:[UIColor blackColor].CGColor]; iconImage.image = [[UIImage alloc] initWithData:data];//根据图片数据流构造image // //TEST NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; [parser setDelegate:self]; [parser parse]; arrySizInt = [arryDataMutable count]; //NSLog(@"[arryDataMutable count]: %d", arrySizInt); //接下来获取剩余四天的天气情况。(谷歌天气每次只有未来四天的信息) //初始化计数,通过次变量的值来打印输出未来四天的信息 int counter = 0; //循环开始,这里从1开始,因为可变数组中第0个,是当天的信息,已经解析输出 for (int i=1; i<arrySizInt; i++) { //NSLog(@"Array: %@", [arryDataMutable objectAtIndex:i]); //获取数组中的对象,存放在字符串中 NSString *dayStr = [[NSString alloc] initWithString:[arryDataMutable objectAtIndex:i]]; // // if ([dayStr isEqualToString:@"Mon"] || // [dayStr isEqualToString:@"Tue"] || // [dayStr isEqualToString:@"Wed"] || // [dayStr isEqualToString:@"Thu"] || // [dayStr isEqualToString:@"Fri"] || // [dayStr isEqualToString:@"Sat"] || // [dayStr isEqualToString:@"Sun"] ) //判断获取的元素是那一天,是需要判断是否相等即可,并且使用或的运算,只要有一个为真,此表达式即成立 if ([dayStr isEqualToString:@"周一"] || [dayStr isEqualToString:@"周二"] || [dayStr isEqualToString:@"周三"] || [dayStr isEqualToString:@"周四"] || [dayStr isEqualToString:@"周五"] || [dayStr isEqualToString:@"周六"] || [dayStr isEqualToString:@"周日"] ) { NSLog(@"counter: %d", counter); //获取数组中剩余的三项 //或许最低温度 NSString *lowStr = [[NSString alloc] initWithString:[arryDataMutable objectAtIndex:(i+1)]]; //获取最高温度 NSString *highStr = [[NSString alloc] initWithString:[arryDataMutable objectAtIndex:(i+2)]]; //获取天气图片路径 NSString *path = [[NSString alloc] initWithString:[arryDataMutable objectAtIndex:(i+3)]]; NSString* iconpath =[NSString stringWithFormat: @"http://www.google.co.uk%@",path]; NSURL* url = [NSURL URLWithString:[iconpath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];//网络图片url NSData* data = [NSData dataWithContentsOfURL:url];//获取图片数据 //获取天气情况 NSString *conditions = [[NSString alloc] initWithString:[arryDataMutable objectAtIndex:(i+4)]]; //将获取的信息整理存放 NSString *tempStrToDisp = [NSString stringWithFormat: @"%@\n %@℃ /%@℃ \n%@", dayStr, lowStr, highStr, conditions]; //打印输出 if (counter == 0)//第一个树结点 { day_of_weekcLable1.text = tempStrToDisp; CALayer *layer = [iconImage1 layer]; [layer setMasksToBounds:YES]; [layer setCornerRadius:5.0]; [layer setBorderWidth:1.0]; [layer setBorderColor:[UIColor blackColor].CGColor]; iconImage1.image = [[UIImage alloc] initWithData:data]; } if (counter == 1)//第二个树结点 { day_of_weekcLable2.text = tempStrToDisp; CALayer *layer = [iconImage2 layer]; [layer setMasksToBounds:YES]; [layer setCornerRadius:5.0]; [layer setBorderWidth:1.0]; [layer setBorderColor:[UIColor blackColor].CGColor]; iconImage2.image = [[UIImage alloc]initWithData:data]; } if (counter == 2)//第三个树结点 { day_of_weekcLable3.text = tempStrToDisp; CALayer *layer = [iconImage3 layer]; [layer setMasksToBounds:YES]; [layer setCornerRadius:5.0]; [layer setBorderWidth:1.0]; [layer setBorderColor:[UIColor blackColor].CGColor]; iconImage3.image = [[UIImage alloc]initWithData:data]; } if (counter == 3)//第四个树结点 { day_of_weekcLable4.text = tempStrToDisp; CALayer *layer = [iconImage4 layer]; [layer setMasksToBounds:YES]; [layer setCornerRadius:5.0]; [layer setBorderWidth:1.0]; [layer setBorderColor:[UIColor blackColor].CGColor]; iconImage4.image = [[UIImage alloc]initWithData:data]; } //计数加1,进行循环 counter = counter + 1; } }//循环结束 } //调用系统方法进行重写 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { //NSLog(@"XML Parser 1 ... elementName ... %@", elementName); //依此得到叶子结点和其属性值 if ([elementName isEqualToString:@"day_of_week"]) { NSString *tempStr = [attributeDict objectForKey:@"data"]; //NSLog(@"day-of-week: %@", tempStr); [arryDataMutable addObject:tempStr]; } if ([elementName isEqualToString:@"low"]) { NSString *tempStr = [attributeDict objectForKey:@"data"]; [arryDataMutable addObject:tempStr]; } if ([elementName isEqualToString:@"high"]) { NSString *tempStr = [attributeDict objectForKey:@"data"]; [arryDataMutable addObject:tempStr]; } if ([elementName isEqualToString:@"condition"]) { NSString *tempStr = [attributeDict objectForKey:@"data"]; [arryDataMutable addObject:tempStr]; } if ([elementName isEqualToString:@"icon"]) { NSString *tempStr = [attributeDict objectForKey:@"data"]; [arryDataMutable addObject:tempStr]; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { //NSLog(@"XML Parser 2 ..."); //NSLog(@"string ... %@", string); } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { //NSLog(@"XML Parser 3 ..."); //NSLog(@"elementName: %@", elementName); //NSLog(@"namespaceURI: %@", namespaceURI); //NSLog(@"qName: %@", qName); }
部分注释不合理,请自行斟酌。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值