完美解析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);
}

部分注释不合理,请自行斟酌。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值