2013-11-15 1 views
1

Я экспериментирую с выбором узлов с помощью XPath ... Я использую следующий код - это мое приложение iOS для сбора информации о типах книг, которыми я владею, будь то в мягкой обложке или в твердом переплете:Выбор узлов с XPath

nodes= [rootNode nodesForXpath:@"Collection/books" error:nil]; 
for (DDXMLNode* node in nodes) 
{ 
    Booktype* bt = [[Booktype alloc] init]; 
    DDXMLNode *nameNode = [[node nodesForXpath:@"OfType" error:nil]; objectAtIndex:0]; 
    bt.type = [nameNode stringValue]; 

    // And lastly, I am adding this object to my array that will be the datasource for my tableView 
    [array addObject:bt]; 
} 

Моя библиотека XML выглядит следующим образом:

<Collection> 

<books> 
    <title lang="eng">Harry Potter</title> 
    <price>29.99</price> 
    <ofType>Hardcover</ofType> 
</books> 

<books> 
    <title lang="eng">Stella Bain</title> 
    <price>19.99</price> 
    <ofType>Hardcover</ofType> 
</books> 

<books> 
    <title lang="eng">The First Phone Call from Heaven</title> 
    <price>12.95</price> 
    <ofType>Paperback</ofType> 
</books> 

<books> 
    <title lang="eng">Learning XML</title> 
    <price>39.95</price> 
    <ofType>Paperback</ofType> 
</books> 

</Collection> 

Так что у меня 2 в мягкой обложке, и 2 книги в твердом переплете: большой. Теперь проблема заключается в том, что при загрузке данных в мой tableView я получаю 4 полные списки для моей ofType запросу:

Я получаю вид таблицы, которая выглядит следующим образом:

enter image description here

Как я могу оставьте только 1 экземпляр типа? Итак, вместо двух из них я получаю только 1 лист в мягкой обложке и 1 лист в твердой обложке ... Я намерен добавить еще tableView, в котором будут перечислены все книги в выбранной категории книг.

Пожалуйста, будьте как можно более конкретными и подробными в своем ответе.

С уважением, -VZM

Обновление: Я пытался реализовать следующее:

if (![array containsObject:bt]) { 
    [array addObject:bt]; 
} 

Но, к сожалению, это возвращающиеся тот же результат.

ответ

0

Вы можете просто проверить его, прежде чем добавить ваш Booktype к array, как,

if (![array containsObject:bt]) { 
    [array addObject:bt]; 
} 
+0

Я просто попытался реализации этого кода, но, к сожалению, это не работает ... Я получаю тот же результат, который получаю, когда я разместил вопрос @Anusha – vzm

0

Вы должны использовать NSPredicate для этого.

Изменение:

[array addObject:bt]; 

С:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.type == %@", bt.type]; 
if ([[array filteredArrayUsingPredicate:predicate] count] == 0) 
{ 
    [array addObject:bt]; 
} 
0

я надеюсь, что это даст представление к вам ...

NSMutableArray *arrayPaperCover = [[NSMutableArray alloc]init]; 
    NSMutableArray *arrayHardCover = [[NSMutableArray alloc]init]; 

    nodes= [rootNode nodesForXpath:@"Collection/books" error:nil]; 
    for (DDXMLNode* node in nodes) 
    { 
     Booktype* bt = [[Booktype alloc] init]; 
     DDXMLNode *nameNode = [[node nodesForXpath:@"OfType" error:nil] objectAtIndex:0]; 
     bt.type = [nameNode stringValue]; 


     if ([bt.type isEqualToString:@"Paperback"]) { 
      [arrayPaperCover addObject:bt]; 

     } 
     else ([bt.type isEqualToString:@"Hardcover"]) { 
      [arrayHardCover addObject:bt]; 

     } 

    } 
    NSMutableArray * dataSource = [[NSMutableArray alloc]init]; // this will be your data source 
    [dataSource addObject:arrayPaperCover]; 
    [dataSource addObject:arrayHardCover]; 
+0

для сомнений ping me – Spynet