2013-02-20 39 views
1

我正在使用Yahoo API製作一個小天氣應用程序。這個API給我一個XML文件。 我現在的問題是如何解析這個文件? 這是我迄今爲止的代碼。使用AFNetworking解析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); 
    }]; 

您可以通過here找到該XML文件。

。希望有人能幫助我

+0

看看這裏 - http://stackoverflow.com/questions/12147883/解析的XML-從-的NSString到獲得值 – 2013-02-20 20:07:15

回答

6

如果您正在尋找解析使用的NSXMLParser你就需要有一個實現NSXMLParserDelegate類個XML。您可以使用您的ViewController此:

@interface ViewController : UIViewController <NSXMLParserDelegate> 

然後使用該協議,當你運行[XMLParser parse]你可以解析這個XML提供的SAX方法。這是給你的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的RSS XML:http://www.suushmedia.com/simple-rss-reader-with-afnetworking/

希望這有助於

0

更好的解決方案:我發現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];