パーサーを作成しますが、解析しません。次のようにパーサーを作成したとしましょう。
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
次に、デリゲートを設定して解析を開始する必要があります。
parser.delegate = self;
[parser parse];
次に、NSXMLParserDelegate
メソッドを作成する必要があります。( の詳細についてNSXMLParser
は、イベント駆動型 XML プログラミング ガイドを参照してください。)たとえば、温度のみが必要な場合は、次のdidStartElement
メソッドを記述できます。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"yweather:condition"])
{
// do whatever you want with `attributeDict`, perhaps saving it in some class property; I'm just going to log it
NSLog(@"current condition = %@", attributeDict);
}
}
都市はWOEIDでなければならないことに注意してください。( API の説明を参照してください。)したがって、次の場所の代わりに:
NSString *location = @"Palermo";
使用する必要があります (イタリアのパレルモの場合):
NSString *location = @"719846";
ちなみに、バックグラウンド キューでこれを行うか、何らかの非同期メカニズムを使用してinitWithContentsOfURL
取得する必要があるという Caleb の意見に同意します。NSData
たとえば、次のことができます。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *location = @"719846";
NSString *temperatureUnit = @"c";
NSString *address = @"http://weather.yahooapis.com/forecastrss?w=";
NSString *request = [NSString stringWithFormat:@"%@%@&u=%@",address,location, temperatureUnit];
NSURL *URL = [NSURL URLWithString:request];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
parser.delegate = self;
[parser parse];
});
バックグラウンド キューでこれを行う場合は、UI の更新をメイン キューに送り返すようにしてください。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"yweather:condition"])
{
// UI updates should be dispatched back to the main queue, e.g.:
dispatch_async(dispatch_get_main_queue(), ^{
NSString *temp = attributeDict[@"temp"];
self.tempLabel.text = temp;
});
}
}