1

Yahoo api を使用して小さな天気アプリを作成しています。この API は、XML ファイルを返します。私の問題は、このファイルをどのように解析できるかです。これが私のこれまでのコードです。

 AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
        NSLog(@"success");
        XMLParser.delegate = self;
        [XMLParser parse];
        NSLog(@"xmlParser is %@",XMLParser);
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {
        NSLog(@"failure with error %@",error);
    }];

XML ファイルはこちらにあります。

誰でも私を助けてくれることを願っています

4

2 に答える 2

6

NSXMLParserを使用してXMLを解析する場合は、NSXMLParserDelegateを実装するクラスが必要です。これには、ViewControllerを使用できます。

@interface ViewController : UIViewController <NSXMLParserDelegate>

次に、このプロトコルによって提供されるSAXメソッドを使用して、を実行するときにこのXMLを解析できます[XMLParser parse]。xmlの例を次に示します。

- (IBAction) makeRequest:(id)sender
{
    NSLog(@"Making request");
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://weather.yahooapis.com/forecastrss?w=2442047&u=c"]];
    AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
        XMLParser.delegate = self;
        [XMLParser parse];
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {
       NSLog(@"failure with error %@",error);
   }];
    [operation start];
}


#pragma mark - Parsing lifecycle

- (void)startTheParsingProcess:(NSData *)parserData
{
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData]; //parserData passed to NSXMLParser delegate which starts the parsing process

    [parser setDelegate:self];
    [parser parse]; // starts the event-driven parsing operation.
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"yweather:astronomy"])
    {
        NSLog(@"Sunrise: %@,  Sunset: %@", [attributeDict valueForKey:@"sunrise"], [attributeDict valueForKey:@"sunset"]);
    }

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    self.tmpInnerTagText = string; // Make a temp NSString to store the text in-between tags
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementName isEqualToString:@"title"])
    {
        NSLog(@"%@", self.tmpInnerTagText);
    }
    if ([elementName isEqualToString:@"description"])
    {
        NSLog(@"%@", self.tmpInnerTagText);
    }
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"Paser Error = %@", parseError);
    //TODO: Create Alert message error
}

また、AFNetworkingで使用しているRSS xmlをサポートするには、次のサイトの指示に従って、acceptableContentTypesに「application / rss +xml」を追加する必要がありました。http: //www.suushmedia.com/simple-rss-reader-with -afnetworking /

お役に立てれば

于 2013-02-20T20:26:01.810 に答える
0

より良い解決策:私はここで見つけました

NSPropertyListFormat format;
NSArray *myObjects = [NSPropertyListSerialization propertyListWithData:responseObject options:NSPropertyListMutableContainers format:&format error:NULL];

    //If the root object of the plist is dictionary

NSDictionary *myObjects = [NSPropertyListSerialization propertyListWithData:responseObject options:NSPropertyListMutableContainers format:&format error:NULL];
于 2014-06-03T05:36:01.937 に答える