Как сохранить основные данные с помощью парсера xml - PullRequest
0 голосов
/ 03 февраля 2012

Я сделал этот парсер xml:

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

Он анализирует xml так:

<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>

Но он падает на линии

 item = [NSEntityDescription entityForName:className inManagedObjectContext:managedObjectContext];

Кто-нибудь может мне помочь?

Спасибо

1 Ответ

1 голос
/ 03 февраля 2012

Я не прочитал весь опубликованный код, но я думаю, что вы ищете этот метод:

[NSEntityDescription insertNewObjectForEntityForName:name
                     inManagedObjectContext:ctx];

+entityForName: получает только описание сущности (типа NSEntityDescription), но вы 'пытаемся создать объект.

...