Skip to content

Instantly share code, notes, and snippets.

@OsamuTakahashi
Created January 8, 2012 09:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OsamuTakahashi/1577809 to your computer and use it in GitHub Desktop.
Save OsamuTakahashi/1577809 to your computer and use it in GitHub Desktop.
Object Creation With XML
#import <Foundation/Foundation.h>
@interface KTObjectLoader : NSObject<NSXMLParserDelegate>
+ (NSArray *)loadObjectsFromURL:(NSURL *)url;
+ (NSArray *)loadObjectsFromData:(NSData *)data;
@end
#import "KTObjectLoader.h"
#define kRootElement @"root"
@interface KTXMLParser : NSXMLParser
@property (assign) NSUInteger state;
@property (assign) NSMutableArray *objects;
@end
@implementation KTXMLParser
@synthesize state = _state;
@synthesize objects = _objects;
@end
@implementation KTInterfaceLoader
static
id _createInstance(NSString *className,NSDictionary *attributes,SEL _cmd) {
Class klass = NSClassFromString(className);
id obj = nil;
if (klass) {
obj = [klass alloc];
if ([obj respondsToSelector:@selector(initWithAttributes:)]) {
obj = [obj performSelector:@selector(initWithAttributes:) withObject:attributes];
} else {
NSLog(@"A instance of class %@ not responds to selector initWithAttributes:",className);
[obj release];
obj = nil;
}
} else {
NSLog(@"Unknown class:%@",className);
}
return obj;
}
- (void)parser:(KTXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
switch (parser.state) {
case 0:
if (![elementName isEqualToString:kRootElement]) {
NSLog(@"The document starts with unknown element %@",elementName);
[parser abortParsing];
}
break;
case 1:
{
id obj = _createInstance(elementName, attributeDict,_cmd);
if (obj) {
[parser.objects addObject:obj];
[obj release];
} else {
NSLog(@"Instance creation failure");
[parser abortParsing];
}
}
break;
default:
NSLog(@"Invalid document structure");
[parser abortParsing];
}
parser.state += 1;
}
- (void)parser:(KTXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
parser.state -= 1;
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSLog(@"%@",parseError);
}
static
NSArray *_parseWithParser(KTXMLParser *parser) {
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
parser.objects = [NSMutableArray array];
if ([parser parse]) {
NSLog(@"load success");
return parser.objects;
}
return nil;
}
- (NSArray *)loadObjectsFromURL:(NSURL *)url {
KTXMLParser *parser = [[[KTXMLParser alloc] initWithContentsOfURL:url] autorelease];
parser.delegate = self;
return _parseWithParser(parser);
}
- (NSArray *)loadObjectsFromData:(NSData *)data {
KTXMLParser *parser = [[[KTXMLParser alloc] initWithData:data] autorelease];
parser.delegate = self;
return _parseWithParser(parser);
}
+ (NSArray *)loadObjectsFromURL:(NSURL *)url {
return [[[[KTObjectLoader alloc] init] autorelease] loadObjectsFromURL:url];
}
+ (NSArray *)loadObjectsFromData:(NSData *)data {
return [[[[KTObjectLoader alloc] init] autorelease] loadObjectsFromData:data];
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment