Parsing an XML file with AFNetworking

匿名 (未验证) 提交于 2019-12-03 08:28:06

问题:

I am making a little weather app using the Yahoo api. This api gives me an XML file back. My problem is now how I can parse this file ? Here is my code that I have so far.

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

You can find the XML file over here.

Hope that anybody can help me

回答1:

If you are looking to parse XMLs using NSXMLParser you'll need to have a class that implements the NSXMLParserDelegate. You can use your ViewController for this:

@interface ViewController : UIViewController <NSXMLParserDelegate> 

Then using the SAX methods provided by this protocol you can parse this XML when you run [XMLParser parse]. Here is an example for your 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 } 

Also to get AFNetworking to support the RSS xml you are using I had to add "application/rss+xml" to the acceptableContentTypes following the instructions from this site: http://www.suushmedia.com/simple-rss-reader-with-afnetworking/

Hope this helps



回答2:

Better Solution: I found here

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]; 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!