2013-07-04 5 views
1

Во второй половине дня overflowers,Создание содержимого массива с использованием словарей NSXMLParsing в прошивкой

В моем коде я пытаюсь разобрать и ответ SOAP, который находится в формате NSData. С этими данными, используя NSXMLParse, я пытаюсь создать массив словарей. Проблема в том, что в любое время, когда я добавляю свой новый словарь в массив, он заменяет содержимое старого словарного ресурса добавленным в настоящее время. Например, в конце синтаксиса у меня есть 7 словарей с одним и тем же содержимым в моем массиве. Вот код, чтобы показать, что я сделал;

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSLog(@"Received the SOAP data."); 

    if (!itemArray) { 
     itemArray = [[NSMutableArray alloc] init]; 
    } 
    else { 
     itemArray = nil; 
     itemArray = [[NSMutableArray alloc] init]; 
    } 

    if (!itemDictionary) { 
     itemDictionary = [[NSMutableDictionary alloc] init]; 
    } 
    else { 
     itemDictionary = nil; 
     itemDictionary = [[NSMutableDictionary alloc] init]; 
    } 

    parser = [[NSXMLParser alloc] initWithData:webData]; 
    [parser setDelegate:self]; 
    [parser parse]; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    NSLog(@"Started Element %@", elementName); 
    element = [NSMutableString string]; 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if(element == nil) { 
     element = [[NSMutableString alloc] init]; 
    } 

    [element appendString:string]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    NSLog(@"Found an element named: %@ with a value of: %@", elementName, element); 

    if (![elementName isEqualToString:@"item"]) { 
     [itemDictionary setValue:element forKey:elementName]; 
    } 
    else if ([elementName isEqualToString:@"item"]) { 
     if (itemDictionary) { 
      [itemArray addObject:itemDictionary]; 

      [itemDictionary removeAllObjects]; 
     } 
    } 
} 

Заранее спасибо. Привет

ответ

0

Вместо:

[itemArray addObject:itemDictionary]; 
[itemDictionary removeAllObjects]; 

Try:

[itemArray addObject:itemDictionary]; 
itemDictionary = [[NSMutableDictionary alloc] init]; 

Таким образом, вместо удаления всех элементов из словаря создать новый словарь для следующего набора контента.

+0

Это очень помогло, спасибо – Engnyl

0

Я думаю, вы ожидали, что каждый itemDictionary - это отдельный объект, который нужно хранить в itemArray. Таким образом, вы должны создать экземпляр dictionay после запуска элемента. попробуйте вот так:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    NSLog(@"Started Element %@", elementName); 
    itemDictionary = [[NSMutableDictionary alloc] init]; 
    element = [NSMutableString string]; 
} 
0

Когда вы вызываете removeAllObjects, он просто использует тот же экземпляр словаря, который добавляется вашим массивом. Когда вы изменяете словарь, вы изменяете тот же словарь, который содержит ваш массив (так как оба на самом деле такие же), поэтому вместо вызова removeAllObjects каждый раз при создании нового элемента создайте новый словарь.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    NSLog(@"Started Element %@", elementName); 
    itemDictionary = [[NSMutableDictionary alloc] init]; 
    element = [NSMutableString string]; 
} 
Смежные вопросы