2013-11-16 4 views
1

В моем приложении я получаю информацию о радиостанции из XML.Ошибка при работе с узламиForXPath

Чтобы продемонстрировать свою проблему, я буду использовать две радиостанции: один из них называется «Рождественская классика», а один называется «Рождественская сила».

Когда я использую следующий код, чтобы получить только рождественские классики и загрузить его в мой tableView он работает просто отлично:

DDXMLNode* rootNode = [xmlDoc rootElement]; 
    NSArray* nodes = nil; 
    nodes = [rootNode nodesForXPath:@"child::Station[Name='Christmas Classics']" error:nil]; 
    for(DDXMLNode* node in nodes) 
    { 
     Station* s = [[Station alloc] init]; 
     DDXMLNode* nameNode = [[node nodesForXPath:@"Name" error:nil] objectAtIndex:0]; 
     s.name = [nameNode stringValue]; 
     DDXMLNode* bitRateNode = [[node nodesForXPath:@"Streams/Stream/BitRate" error:nil] objectAtIndex:0]; 
     s.bitRate = [bitRateNode stringValue]; 
     DDXMLNode* streamNode = [[node nodesForXPath:@"Streams/Stream/StreamUrl" error:nil] objectAtIndex:0]; 
     s.streamURL = [streamNode stringValue]; 
     [array addObject:s]; 
    } 

Однако, когда я пытаюсь получить «рождественскую Power» таким же образом (как в то же время) путем внедрения:

DDXMLNode* rootNode = [xmlDoc rootElement]; 
    NSArray* nodes = nil; 
    nodes = [rootNode nodesForXPath:@"child::Station[Name='Christmas Classics']" error:nil]; 
    for(DDXMLNode* node in nodes) 
    { 
     Station* s = [[Station alloc] init]; 
     DDXMLNode* nameNode = [[node nodesForXPath:@"Name" error:nil] objectAtIndex:0]; 
     s.name = [nameNode stringValue]; 
     DDXMLNode* bitRateNode = [[node nodesForXPath:@"Streams/Stream/BitRate" error:nil] objectAtIndex:0]; 
     s.bitRate = [bitRateNode stringValue]; 
     DDXMLNode* streamNode = [[node nodesForXPath:@"Streams/Stream/StreamUrl" error:nil] objectAtIndex:0]; 
     s.streamURL = [streamNode stringValue]; 
     [array addObject:s]; 
    } 

    NSArray *node2 = nil; 
    node2 = [rootNode nodesForXPath:@"child::Station[Name='Christmas Power']" error:nil]; 
    for(DDXMLNode* node in nodes) 
    { 
     Station* b = [[Station alloc] init]; 
     DDXMLNode* nameNode = [[node nodesForXPath:@"Name" error:nil] objectAtIndex:0]; 
     b.name = [nameNode stringValue]; 
     DDXMLNode* bitRateNode = [[node nodesForXPath:@"Streams/Stream/BitRate" error:nil] objectAtIndex:0]; 
     b.bitRate = [bitRateNode stringValue]; 
     DDXMLNode* streamNode = [[node nodesForXPath:@"Streams/Stream/StreamUrl" error:nil] objectAtIndex:0]; 
     b.streamURL = [streamNode stringValue]; 
     [array addObject:b]; 
    } 

Это результат, который я получаю:

enter image description here

My table view загружается, но вместо того, чтобы иметь список для Christmas Classics и список для Christmas Power, я получаю 2 рождественских классики. Почему это происходит? Что я делаю неправильно? Есть ли лучший способ сделать это? Все станции, на которых я работаю, находятся в одном корневом каталоге /Station

Мне просто нужно указать, какие из них нужно вернуть, я не хочу, чтобы возвращалось 100 списков, я просто хочу, чтобы те, что я указываю обратно ....

ответ

1

Я думаю, что у вас есть крошечный маленький код в вашем коде. Хотя у вас есть два разных узла устанавливает nodes и node2 вы перебрать первого узла, установленного в обоих случаях:

for(DDXMLNode* node in nodes) 

Я предлагаю вам изменить второй итератор

for(DDXMLNode* node in node2) 

и посмотреть, что происходит.

+0

Aha! Должно быть, я это обновлюсь, как только приступлю к работе сегодня вечером. – vzm

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