2009-06-23 3 views
1

Ich habe this tutorial gefolgt und der Parsing-Teil funktioniert einwandfrei. Mein Problem ist, dass beim Ausdrucken der Werte, die ich im Objekt ablege (in meinem Fall ist das Objekt ein Auto), immer Null bleibt. Ich speichere alle Objekte in einem NSMutableArray, das immer eine Länge hat/count == 0 ... was mache ich falsch? Das Array ist, wie in dem Code zu sehen ist, in der Delegate-Klasse definiert ...XMLParser und NSMutableArray

- (XMLParser *) initXMLParser { 
    [super init]; 
    appDelegate = (Car2GoAppDelegate *) [[UIApplication sharedApplication]delegate]; 
    currentElementValue = [[NSMutableString alloc]init]; 
    return self; 
} 


- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attribute:(NSDictionary *)attributeDict { 
    if([elementName isEqualToString:@"kml"]) { 
     appDelegate.cars = [[NSMutableArray alloc]init]; 
    } 
    else if([elementName isEqualToString:@"Placemark"]) { 
     aCar = [[Car alloc]init]; 
    } 
    else 
    return; 
} 


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *) string { 
    [currentElementValue appendString:string]; 

} 


- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *) elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if([elementName isEqualToString:@"kml"]) 
     return; 
    if([elementName isEqualToString:@"Style"]) 
     return; 
    if([elementName isEqualToString:@"IconStyle"]) 
     return; 
    if([elementName isEqualToString:@"Icon"]) 
     return; 
    if([elementName isEqualToString:@"color"]) 
     return; 
    if([elementName isEqualToString:@"colorMode"]) 
     return; 
    if([elementName isEqualToString:@"scale"]) 
     return; 
    if([elementName isEqualToString:@"href"]) 
     return; 
    if([elementName isEqualToString:@"styleUrl"]) 
     return; 
    if([elementName isEqualToString:@"a"]) 
     return; 

    if([elementName isEqualToString:@"Placemark"]) { 
     [appDelegate.cars addObject:aCar]; 
     [aCar release]; 
     aCar = nil; 
    } 

    else if([elementName isEqualToString:@"name"]) { 
     [aCar setValue:currentElementValue forKey:elementName]; 
    } 

    else if([elementName isEqualToString:@"description"]) { 
     [aCar setValue:currentElementValue forKey:elementName]; 
     [currentElementValue setString:@""]; 
    } 
    else if([elementName isEqualToString:@"coordinates"]) { 
     [aCar setValue:currentElementValue forKey:elementName]; 
     [currentElementValue setString:@""]; 
     NSLog(@"aCar coordinates:%@", [aCar coordinates]); 
    } 
    else 
     return; 
} 

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

@end 

/Schleife

Antwort

0

Ihr Code OK aussieht. Sind Sie sicher, dass Ihr XML-Element Elemente enthält, die in Placemark-Tags eingebettet sind?

Gibt es auch mehr als ein kml-Element in Ihrem XML? Könnte es einen geben, der leer ist, was dazu führt, dass das ursprüngliche Array verworfen und durch ein neues mit der Länge 0 ersetzt wird?

+0

Ich auch, obwohl dies verdächtig war. Du bringst die appDelegate.cars jedes Mal weg, wenn du ein kml-Element bekommst. Ich weiß nicht, ob du das willst oder nicht. – amattn

-1

Sie müssen nicht die Methode initWithCapacity verwenden, um das mutableArray ordnungsgemäß zu initialisieren?

Anstatt direkt appDelegate.cars verwenden, versuchen Sie mit einem lokalen MutableArray, und sehen, ob etwas anders ist?

+0

InitWithCapacity hilft Ihnen Speicher zu sparen, wenn Sie im Voraus wissen, wie viele Elemente im Array gespeichert werden. Persönlich verwende ich es selten, es sei denn, ich erstelle feste Arrays, die nicht wachsen werden. – amattn