2013-09-16 4 views
0

Я немного зациклился на этой проблеме. Вот такая ситуация: я разбираю xml-файл с позициями, я разбираю его хорошо, вещь Я хочу поместить различные элементы в NSDictionary (один NSDictionary для каждой позиции) и эти NSDictionary в NSMutableArray.Загрузка NSDictionary синтаксический анализ xml-файла

- (void) traverseElement:(TBXMLElement *)element { 

NSMutableDictionary *position = [[NSMutableDictionary alloc]init]; 
NSArray *keys = [NSArray arrayWithObjects:@"cab",@"idagencedepart", @"idagencefinale",@"iddestinataire",@"idexpediteur",@"idtransporteurreexpedition",@"departement",@"message1", nil]; 
[position dictionaryWithValuesForKeys:keys]; 

do { 

    TBXMLAttribute * attribute = element->firstAttribute; 


    // if attribute is valid 

    while (attribute) { 


     if ([[TBXML elementName:element] isEqualToString:@"referencecolis"]) { 
      [position setObject:[TBXML textForElement:element] forKey:@"cab"]; 
      NSLog(@"cab : %@",[TBXML textForElement:element]); 
      }; 

     if ([[TBXML elementName:element] isEqualToString:@"idagencedepart"]) { 
      [position setObject:[TBXML textForElement:element] forKey:@"idagencedepart"]; 
      NSLog(@"idagencedepart : %@",[TBXML textForElement:element]); 

     }; 

     [modulectrlcle addObject:position]; 

    attribute = attribute->next; 



    } 

    if (element->firstChild) 

     [self traverseElement:element->firstChild]; 



} while ((element = element->nextSibling)); 

}

}

Вот мой код. Он разбирает хорошо, но мой NSMutableArray (modulectrle) наполнен странными NSDictionaries ...

+0

Можете ли вы также поместить ссылку на XML, чтобы мы могли проверить, действительно ли это файл XML? Обычно с анализаторами проблема заключается в том, что XML недействителен. –

+0

Это не проблема анализатора, когда я NSLog результат синтаксического анализа, это моя проблема, когда я заполняю данные в NSDictionary. Где и когда я должен инициировать NSDictionary и добавить его в NSMutableArray? Когда я NSlog NSDictionary, это либо ноль, либо это то же самое сотни раз – Romain

+0

Что такое modulectrlcle? Вы добавляете позицию в modulectrlcle. И в следующем цикле цикла вы добавляете снова значения к тому же NSDictonary и снова добавляете его в массив ... –

ответ

-1

Выделяют NSDictonary в то время как цикл:

do { 
    TBXMLAttribute * attribute = element->firstAttribute; 
    while (attribute) { 
     NSMutableDictionary *position = [[NSMutableDictionary alloc]init]; 

     BOOL foundElement = NO; 
     if ([[TBXML elementName:element] isEqualToString:@"referencecolis"]) { 
      [position setObject:[TBXML textForElement:element] forKey:@"cab"]; 
      NSLog(@"cab : %@",[TBXML textForElement:element]); 
      foundElement = YES; 
     }; 

     if ([[TBXML elementName:element] isEqualToString:@"idagencedepart"]) { 
      [position setObject:[TBXML textForElement:element] forKey:@"idagencedepart"]; 
      NSLog(@"idagencedepart : %@",[TBXML textForElement:element]); 
      foundElement = YES; 
     }; 

     if(foundElement) //avoid adding empty NSDictonaries 
     { 
      [modulectrlcle addObject:position]; 
     } 

     attribute = attribute->next; 
    } 

    if (element->firstChild) 
     [self traverseElement:element->firstChild]; 

} while ((element = element->nextSibling)); 

В противном случае вы добавите же NSDictonary снова в массив и вы нажимаете все элементы в один словарь, и в результате вы получаете массив с одним и тем же словарем несколько раз.

+0

'NSDictionary' имеет метод' count', не нужно тратить циклы процессора, создавая временный 'NSArray' для получения количества элементов. – JustSid

+0

@JustSid не оптимизирован точно - лучшим решением будет создание NSMutableDictonary снаружи и очистка его, а не выделение каждый раз - я обновлю свой ответ после того, как я его знаю. –

+0

Проверьте мое обновление для оптимизации памяти/производительности, чтобы выделить объект только один раз и повторно использовать его - также используя флаг BOOL вместо вычисления счетчика каждый раз, как предлагалось @JustSid. –

Смежные вопросы