Created
January 8, 2012 09:16
-
-
Save OsamuTakahashi/1577809 to your computer and use it in GitHub Desktop.
Object Creation With XML
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <Foundation/Foundation.h> | |
@interface KTObjectLoader : NSObject<NSXMLParserDelegate> | |
+ (NSArray *)loadObjectsFromURL:(NSURL *)url; | |
+ (NSArray *)loadObjectsFromData:(NSData *)data; | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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