2013-11-07 4 views
0

Я разбираю XML-файл и после разбора получаю объект NSDictionary (XMLDictionary named). Я разбор это:Невозможно извлечь нужную информацию из NSDictionary

<result><node><id>27</id><name>Name 1</name><type>0</type><price>0</price><img>/upload/iblock/1a1/1a138b2d4da6e42398beeb21acc8e84f.png</img></node><node><id>28</id><name>Name 2</name><type>0</type><price>0</price><img>/upload/iblock/b72/b724d1550f93987a73b04974b5f7390e.png</img></node></result> 

После этого я пытаюсь это (titleArr - NSArray):

_titleArr = [[[[_xmlDictionary objectForKey:@"result"] objectForKey:@"node"] objectForKey:@"name"] valueForKey:@"text"]; 

В Run время я получаю эту ошибку в строке выше: «Тема 1: сигнал SIGABRT ". Как я могу исправить эту проблему?

+0

Во-первых, NSLog словарь, чтобы вы могли видеть его фактическую структуру. Затем изучите, как получить трассировку стека и фактическое исключение, если возникает исключение. –

+1

Разделить вложенные 'objectForKey:' вызовы в отдельные операторы и проверить все промежуточные результаты. –

+0

@MartinR - Справа. Когда вы отлаживаете, это плохая практика, чтобы все это было натянуто. Невозможно сказать, какова точная причина неудачи. Темпс действительно ничего не стоит, а длинные строки - не обязательно хороший стиль кодирования. –

ответ

0
NSError* parseError = nil; 
_xmlDictionary = [XMLReader dictionaryForXMLString:myXMLString error:&parseError]; 
if (parseError != nil) { 
    NSLog(@"Error on XML parse: %@", parseError); 
} 

NSLog(@"The full dictionary is %@", _xmlDictionary); 

NSDictionary* result = [_xmlDictionary objectForKey:@"result"]; 
NSLog(@"'result' = %@", result); 
NSDictionary* node = [result objectForKey:@"node"]; 
NSLog(@"'node' = %@", node); 
NSString* name = [node objectForKey:@"name"]; 
NSLog(@"'name' = %@", name); 

По крайней мере, если это не удается, ошибка будет изолирована к одной операции. И NSLogs покажет вам значения после каждого шага.

+0

спасибо, вы можете мне помочь снова, пожалуйста, мой объект NSDicioanry после синтаксический анализ выглядит так: result = {node = ({id = {text = 27;}; img = {text = "acc8e84f.png";}; name = {text = rtrttrrt;}; price = {text = 0; }; type = {text = 0;};} Я пытаюсь NSArray * titleArray = [[[xmlDictionary objectForKey: @ "result"] objectForKey: @ "node"] objectForKey: @ "name"] valueForKey: @ "text "], но это не сработает. Где моя ошибка? –

+0

@ ИванГнатюк -' result = {node = ({id = ... '- The" ("символ означает, что" node "является NSArray. Поэтому вам нужно сделать «узел» NSArray, затем взять каждый (или только первый) его элемент и обработать это как NSDictionary, из которого вы получите «имя». * И не стесняйтесь вместе! Разделите его на отдельные задания. * –

+0

Если 'node' - это массив, как он может хранить структуру данных дерева, или я ничего не могу понять? Я пытаюсь сделать это: '_nodeArray = [_xmlDictionary objectForKey: @" node "]; _titleArr = [[_nodeArray objectForKey: @ "name"] valueForKey: @ "text"]; 'Но это не работает, как я могу это сделать? –

0

Попробуйте это:

NSArray *arrResult = [_xmlDictionary objectForKey:@"result"]; 
for(int i = 0; i < [arrResult count]; i++) 
{ 
    NSArray *arrNode = [arrResult objectAtIndex:i] valueForKey:@"node"]; 
    NSString *sName = [arrNode valueForKey:@"Name"]; 
    NSLog(@"Name : %@",sName); 
} 

Отредактированный Ответ

NSArray *arrResult = [_xmlDictionary valueForKey:@"result"]; 
    for (int i = 0; i < [arrResult count]; i++) { 
     NSDictionary *dicNode = [[arrResult objectAtIndex:i] valueForKey:@"Node"]; 
     NSString *sName = [dicNode valueForKey:@"Name"]; 
     NSLog(@"Name : %@",sName); 
    } 
+0

on line «NSstring * arrNode = ...» - SIGABRT (и я исправляю его NSArray * arrNode = ** [** [arrResult objectAtIndex: i] valueForKey: @ "node"]; –

+0

arrNode не является строкой. NSArray. Вы пишете NSArray? – spaleja

+0

нет нет, я просто ошибаюсь в комментарии, в коде -NSArray –

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