【问题标题】:Yahoo weather API using NSXMLParser [closed]使用 NSXMLParser 的 Yahoo 天气 API [关闭]
【发布时间】:2013-07-13 19:48:19
【问题描述】:

这是雅虎提供的文档: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 获取温度值

【问题讨论】:

标签: ios objective-c url nsxmlparser weather-api


【解决方案1】:

你创建你的解析器,但你不解析。假设您像这样创建了解析器:

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 description。)所以,而不是位置:

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;
        });
    }
}

【讨论】:

  • 完美运行!我希望这对其他人有所帮助
【解决方案2】:

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

【讨论】:

  • 你能给我苹果提供的例子的链接吗
  • URL Loading System Programming Guide 一个,但这是一个常见的任务,这里有很多例子。
  • 感谢您的建议!但是,如果您愿意,能否更准确地解释一下如何解析我的数据?
猜你喜欢
  • 2019-05-28
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2014-08-05
  • 2011-07-15
相关资源
最近更新 更多