-1

这是雅虎提供的文档: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,请参阅Event-Driven XML Programming Guide。)例如,如果您只需要温度,您可以编写一个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";

顺便说一句,我同意 Caleb 的观点,即您应该initWithContentsOfURL在后台队列中执行此操作,或者您应该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 回答
1

您需要从该 URL 创建一个 URL 请求,使用 发出请求NSURLConnection并接收响应。Apple 的文档中有很多很好的例子,这里不再赘述。或者,您可以initWithContentsOfURL:像上面那样使用,但不要在主线程中这样做,因为它会导致您的应用程序在收到响应之前冻结;如果服务器响应时间过长,iOS 将终止您的应用程序。获得响应后,您将使用 XML 解析器对其进行解析——您需要创建一个委托,以便解析器在解析过程中遇到数据时将其交给您。

于 2013-07-13T19:55:36.927 回答