-1

これは Yahoo が提供するドキュメントです: http://developer.yahoo.com/weather/

現時点では、これは私のコードです:

NSString *location =  @"Palermo";
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 * doc = [[NSXMLParser alloc] initWithContentsOfURL:URL];

NSXMLParser を使用して温度値を取得する方法を知りたい

4

2 に答える 2

4

パーサーを作成しますが、解析しません。次のようにパーサーを作成したとしましょう。

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;
        });
    }
}
于 2013-07-13T21:44:03.567 に答える