我正在尝试用XPath选择节点... 我使用以下代码是我的iOS应用程序来收集有关我拥有的书籍类型的一些信息,无论是平装书还是精装书:
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];
}
My Library 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
时,我的ofType
请求总共列出了4个:
我得到一个如下所示的表格视图:
我怎样才能只有1个类型的实例? 因此,我将只获得1个平装清单和1个精装清单,而不是每个2个...我的意图是稍后添加另一个tableView
,它将列出所选类型的图书类别中的所有图书。
请在答案中尽可能详细和详细。
此致 -VZM
更新:我试图实施以下内容:
if (![array containsObject:bt]) {
[array addObject:bt];
}
但不幸的是,这会返回相同的结果。
答案 0 :(得分:0)
您可以在将Booktype
添加到array
之前简单地进行检查,
if (![array containsObject:bt]) {
[array addObject:bt];
}
答案 1 :(得分:0)
您需要使用NSPredicate。
变化:
[array addObject:bt];
使用:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.type == %@", bt.type];
if ([[array filteredArrayUsingPredicate:predicate] count] == 0)
{
[array addObject:bt];
}
答案 2 :(得分: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];