Добавление объектов в NSMutableArray, порядок кажется странным при разборе из файла XML - PullRequest
0 голосов
/ 07 мая 2009

Я анализирую XML-файл для двух элементов: "title" и "noType". После их анализа я добавляю их в объект с именем aMaster, экземпляр моего собственного мастер-класса, который содержит переменные NSString.

Затем я добавляю эти экземпляры в массив NSMutableArray для одиночного вызова, чтобы вызвать их в другом месте программы. Проблема в том, что когда я их вызываю, они, кажется, не находятся в одном и том же индексе NSMutableArray ... каждый индекс содержит либо заголовок, либо элемент noType, когда он должен быть обоим ... может кто-нибудь увидеть, кто я такой делать неправильно? Ниже приведен код для парсера. Большое спасибо !!

#import "XMLParser.h"
#import "Values.h"
#import "Listing.h"
#import "Master.h"

@implementation XMLParser

@synthesize sharedSingleton, aMaster;

- (XMLParser *) initXMLParser {

    [super init];
    sharedSingleton = [Values sharedValues];
    aMaster = [[Master init] alloc];
    return self;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict {

    aMaster = [[Master alloc] init];

        //Extract the attribute here.

    if ([elementName isEqualToString:@"intro"]) {
        aMaster.intro = [attributeDict objectForKey:@"enabled"];
    } else if ([elementName isEqualToString:@"item"]) {
        aMaster.item_type = [attributeDict objectForKey:@"type"];
        //NSLog(@"Did find item with type %@", [attributeDict objectForKey:@"type"]);

        //NSLog(@"Reading id value :%@", aMaster.item_type);
    } else {
        //NSLog(@"No known elements");
    }

    //NSLog(@"Processing Element: %@", elementName);    //HERE
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

    if(!currentElementValue) 
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    else {
        [currentElementValue appendString:string];//[tempString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
        CFStringTrimWhitespace((CFMutableStringRef)currentElementValue);
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"item"]) {
        [sharedSingleton.master addObject:aMaster];
        NSLog(@"Added %@ and %@ to the shared singleton", aMaster.title, aMaster.noType);  //Only having one at a time added... don't know why
        [aMaster release];

        aMaster = nil;

    } else if ([elementName isEqualToString:@"title"]) {
        [aMaster setValue:currentElementValue forKey:@"title"];
    } else if ([elementName isEqualToString:@"noType"]) {
        [aMaster setValue:currentElementValue forKey:@"noType"]; 
        //NSLog(@"%@ should load into the singleton", aMaster.noType);
    }
    NSLog(@"delimiter");
    NSLog(@"%@ should load into the singleton", aMaster.title);
    NSLog(@"%@ should load into the singleton", aMaster.noType);

    [currentElementValue release];
    currentElementValue = nil;

}

- (void) dealloc {
    [aMaster release];
    [currentElementValue release];
    [super dealloc];
}

@end

1 Ответ

0 голосов
/ 07 мая 2009

Каждый раз, когда вызывается didStartElement, вы устанавливаете aMaster для нового экземпляра класса Master. Основываясь на реализации didEndElement, создается впечатление, что вы должны создавать новый экземпляр только при обнаружении нового тега item. Возможно, поэтому каждая запись в массиве имеет одно или другое значение, поскольку для каждого значения создается новый экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...