#import <UIKit/UIKit.h>
// xml 파싱을 위해서 NSXMLParserDelegate를 반드시 참조해줘야 합니다.
@interface GoogleWeatherViewController : UIViewController <NSXMLParserDelegate> {
NSMutableData *receiveData; // xml을 받을 데이터
NSURLConnection *urlConnection; // 커넥션
NSString *condition; // 오늘의 날씨를 받을 스트링
}
@property (nonatomic, retain) NSMutableData *receiveData;
@property (nonatomic, retain) NSURLConnection *urlConnection;
@property (nonatomic, retain) NSString *condition;
@end
#import "GoogleWeatherViewController.h"
@implementation GoogleWeatherViewController
@synthesize receiveData, urlConnection, condition;
- (void)viewDidLoad {
[super viewDidLoad];
// 데이터 초기화
self.receiveData = [[NSMutableData alloc] init];
// 서울의 날씨를 가져오기 위한 주소 string 초기화
NSMutableString *str = [NSMutableString stringWithString:@"http://www.google.com/ig/api?weather=seoul"];
// request 초기화
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:str]];
// 다음과 같은 값을 추가해 줘야한다.
[request addValue:@"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ko; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2" forHTTPHeaderField:@"User-Agent"];
// 델리게이트를 이용해 커넥션한다.
self.urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
// 커넥션 데이터 받기 완료 델리게이트
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
// xml 데이터를 받아온다.
[self.receiveData appendData:data];
}
// 커넥션 로딩 마침 델리게이트
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
// 받아온 데이터를 파싱한다.
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:self.receiveData];
[xmlParser setDelegate:self];
[xmlParser parse];
}
// 현재 엘레먼트를 구분하기 위한 BOOL
BOOL flag;
// 파싱 델리게이트
// 여기에서 날씨의 정보를 가져옵니다.
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"current_conditions"]) {
// 현재 참조할 엘리먼트가 맞으면
flag = YES;
}
if (flag == YES && [elementName isEqualToString:@"condition"]) {
self.condition = [attributeDict objectForKey:@"data"];
// flag == NO;
//return;
}
if(flag == YES && [elementName isEqualToString:@"temp_c"])
{
//self.temp = [attributeDict objectForKey:@"data"];
// 엘리먼트의 참조가 끝나면 flag 값을 NO로 해줘야 합니다..
// NO 해주지 않으면 엘리먼트 정보를 계속 불러와서 다음날 정보가 저장되어 있을 것입니다.;;;;;
// flag == NO;
//return;
}
}