Revision: 23074
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at January 29, 2010 11:36 by espinallab
Initial Code
// // RssParser.h // RSS // // Copyright 2008 WillowTree Consulting Group, Inc. All rights reserved. // #import <Foundation/Foundation.h> @interface RssParser : NSObject { @private NSMutableDictionary *root; NSMutableDictionary *itemsDictionary; NSMutableArray *items; NSMutableData *webData; NSString *requestUrl; NSString *currentElement; BOOL success; BOOL loading; BOOL parsed; BOOL inItem; NSInteger callId; id parentDelegate; SEL onCompleteCallback; } - (id)init:(NSInteger)identifier; - (void)parse:(NSString *)url withDelegate:(id)sender onComplete:(SEL)callback; - (void)parseResponse; - (NSDictionary *)getRoot; - (NSArray *)getItems; - (NSInteger)getId; - (BOOL)isSuccessful; - (BOOL)isLoading; - (BOOL)isParsed; @end // // RssParser.m // RSS // // Copyright 2008 WillowTree Consulting Group, Inc. All rights reserved. // #import "RssParser.h" @implementation RssParser - (id) init:(NSInteger)identifier { self = [super init]; if (self) { callId = identifier; root = [[NSMutableDictionary alloc] init]; items = [[NSMutableArray alloc] init]; success = NO; loading = NO; parsed = NO; currentElement = nil; } return self; } - (void)parse:(NSString *)url withDelegate:(id)sender onComplete:(SEL)callback { parentDelegate = sender; onCompleteCallback = callback; requestUrl = [url retain]; loading = YES; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[[NSURL alloc] initWithString:requestUrl]]; [request setHTTPMethod:@"GET"]; [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; [[NSURLConnection alloc] initWithRequest:request delegate:self]; [request release]; webData = [[NSMutableData data] retain]; } - (BOOL)isSuccessful { return success; } - (BOOL)isLoading { return loading; } - (BOOL)isParsed { return parsed; } - (NSInteger)getId { return callId; } - (NSArray *)getItems { return items; } - (NSDictionary *)getRoot { return root; } // HTTP Request Handling functionality - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { success = NO; loading = NO; if ([parentDelegate respondsToSelector:onCompleteCallback]) { [parentDelegate performSelector:onCompleteCallback withObject:self]; } } - (void)connection:(NSURLConnection *)connection didReceivedAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { success = NO; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [webData appendData:data]; } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { if ([response isKindOfClass:[NSHTTPURLResponse class]]) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; NSLog(@"RssParser: Response is an NSHTTPURLResponse: Response=%d", [httpResponse statusCode]); // Does not handle authentication quite yet. if ([httpResponse statusCode] >= 400 && [httpResponse statusCode] <= 599) { success = NO; } else if ([httpResponse statusCode] >= 100 && [httpResponse statusCode] <= 299) { success = YES; } else { NSLog(@"RssParser: Status code is unknown."); } } } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease]; if ([dataString length] > 0) { [self parseResponse]; } loading = NO; } - (void)parseResponse { NSXMLParser *parser = [[NSXMLParser alloc] initWithData:webData]; [parser setDelegate:self]; [parser setShouldProcessNamespaces:NO]; [parser setShouldReportNamespacePrefixes:NO]; [parser setShouldResolveExternalEntities:NO]; [parser parse]; } // XML Parser functionality - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { NSLog(@"RestResponse: Parsing error occurred."); parsed = NO; loading = NO; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { NSString *element = [elementName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; currentElement = element; if ([[currentElement lowercaseString] isEqual:@"item"]) { inItem = YES; itemsDictionary = [[NSMutableDictionary alloc] init]; } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { NSString *element = [elementName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; if ([[element lowercaseString] isEqual:@"item"]) { inItem = NO; [items addObject:itemsDictionary]; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSString *stringValue = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; NSString *element = [currentElement stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; // Skip over blank elements. if (stringValue == nil || [stringValue isEqual:@""]) { return; } if (element != nil && [element length] > 0) { if (inItem) { if ([itemsDictionary objectForKey:element] != nil) { // If we're adding categories, we can safely add a comma. Otherwise, we don't, and append the string data. if ([element isEqual:@"category"]) { [itemsDictionary setObject:[NSString stringWithFormat:@"%@, %@", [itemsDictionary objectForKey:element], stringValue] forKey:element]; } else { [itemsDictionary setObject:[NSString stringWithFormat:@"%@%@", [itemsDictionary objectForKey:element], stringValue] forKey:element]; } } else { [itemsDictionary setObject:stringValue forKey:element]; } } else { if ([root objectForKey:element] != nil) { if ([element isEqual:@"category"]) { [root setObject:[NSString stringWithFormat:@"%@, %@", [root objectForKey:element], stringValue] forKey:element]; } else { [root setObject:[NSString stringWithFormat:@"%@%@", [root objectForKey:element], stringValue] forKey:element]; } } else { [root setObject:stringValue forKey:element]; } } } } - (void)parserDidStartDocument:(NSXMLParser *)parser { NSLog(@"RssParser: Started document."); } - (void)parserDidEndDocument:(NSXMLParser *)parser { parsed = YES; loading = NO; if ([parentDelegate respondsToSelector:onCompleteCallback]) { [parentDelegate performSelector:onCompleteCallback withObject:self]; } } - (void)dealloc { [super dealloc]; [requestUrl release]; requestUrl = nil; [webData release]; webData = nil; } @end
Initial URL
http://code.google.com/p/iphone-simple-rss-aggregator/source/browse/trunk/Simple+RSS/Classes/RssParser.m
Initial Description
I'm using this Rss Parser for clubplanet app, it works really fast and easy to implement
Initial Title
RssParser that works
Initial Tags
xml
Initial Language
Objective C