I made this xml parser :
XMLToObjectParser.m :
#import "XMLToObjectParser.h"
@implementation XMLToObjectParser
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
- (NSArray *)items
{
return items;
}
- (id)parseXMLAtURL:(NSURL *)url
toObject:(NSString *)aClassName
parseError:(NSError **)error
{
//[items release];
items = [[NSMutableArray alloc] init];
className = aClassName;
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:self];
[parser parse];
if([parser parserError] && error) {
*error = [parser parserError];
}
//[parser release];
return self;
}
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:className]) {
// create an instance of a class on run-time
item = [NSEntityDescription entityForName:className inManagedObjectContext:managedObjectContext];
}
else {
currentNodeName = [elementName copy];
currentNodeContent = [[NSMutableString alloc] init];
}
}
- (void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
//NSLog(@"Close tag: %@", elementName);
if([elementName isEqualToString:className]) {
[items addObject:item];
//[item release];
item = nil;
}
else if([elementName isEqualToString:currentNodeName]) {
// use key-value coding
[item setValue:currentNodeContent forKey:elementName];
//[currentNodeContent release];
currentNodeContent = nil;
//[currentNodeName release];
currentNodeName = nil;
}
}
- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{
[currentNodeContent appendString:string];
}
- (void)dealloc
{
//[items release];
//[super dealloc];
}
@end
XMLToObjectParser.h :
#import <Foundation/Foundation.h>
@interface XMLToObjectParser : NSObject <NSXMLParserDelegate> {
NSString *className;
NSMutableArray *items;
NSObject *item; // stands for any class
NSString *currentNodeName;
NSMutableString *currentNodeContent;
NSManagedObjectContext *managedObjectContext;
}
- (NSArray *)items;
- (id)parseXMLAtURL:(NSURL *)url
toObject:(NSString *)aClassName
parseError:(NSError **)error;
@end
It’s parsing a xml like this :
<section id="2">
<label>Animaux</label>
<image>Images/Rayons/Bandeau/Animaux.png</image>
<key>Images/Rayons/Bandeau/Animaux.png</key>
<products>
<Product id="21">
<category_id>Chat</category_id>
<label>Aliments pour chat</label>
<price>2.00</price>
</Product>
<Product id="1286">
<category_id>Chat</category_id>
<label>Boite de paté</label>
<price>0.00</price>
</Product>
</products>
</sections>
But it crashes on the line
item = [NSEntityDescription entityForName:className inManagedObjectContext:managedObjectContext];
Anyone can help me?
Thank you
I didn’t read all code posted, but I think you’re looking for this method:
+entityForName:only gets the entity description (of typeNSEntityDescription) but you’re trying to create an object.