在实现中用到的一些方法,再此文中可以找到:完美解析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);
}
部分注释不合理,请自行斟酌。