2009-05-07 39 views
0

Ich analysiere eine XML-Datei für zwei Elemente: "title" und "noType". Sobald diese analysiert sind, füge ich sie zu einem Objekt namens Master hinzu, einer Instanz meiner eigenen Master-Klasse, die NSString-Variablen enthält.Hinzufügen von Objekten zu einem NSMutableArray, Reihenfolge erscheint beim Analysieren aus einer XML-Datei ungerade

Ich füge diese Instanzen dann zu einem NSMutableArray in einem Singleton hinzu, um sie an anderer Stelle im Programm aufzurufen. Das Problem ist, dass, wenn ich sie anrufe, sie scheinen nicht auf dem gleichen NSMutableArray-Index zu sein ... jeder Index enthält entweder den Titel oder das noType-Element, wenn es beides sein sollte ... kann jemand sehen, was ich sein kann falsch machen? Unten ist der Code für den Parser. Vielen Dank!!

#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 

Antwort

0

Jedes Mal, wenn didStartElement genannt wird, sind Sie aMaster auf eine neue Instanz der Master Klasse. Basierend auf der Implementierung von didEndElement sieht es so aus, als ob Sie nur dann eine neue Instanz erstellen sollten, wenn ein neues item-Tag gefunden wird. Dies könnte der Grund sein, warum jeder Eintrag im Array den einen oder anderen Wert hat, da für jeden Wert eine neue Instanz erstellt wird.

+0

Danke Andy! Das war der Schuldige. Das hatte ich komplett vermisst. –

+1

Wenn Sie Ihre Frage beantworten, sollten Sie meine Antwort akzeptieren (drücken Sie das Häkchen auf der linken Seite meiner Antwort), so dass sie nicht mehr als unbeantwortet angezeigt wird. – Andy

Verwandte Themen