使用nodesForXPath时出错

时间:2013-11-16 05:04:37

标签: ios iphone objective-c xml xpath

在我的应用程序中,我从XML获取电台信息。

为了证明我的问题,我将使用两个广播电台:一个叫做“圣诞节经典”,一个叫做“圣诞节电源”。

当我使用以下代码获取JUST圣经经典并将其加载到我的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];
    }

然而,当我试图通过实施以同样的方式(同时)获得“圣诞节力量”时:

 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

我的桌面视图加载了,但我没有圣诞节经典列表和圣诞节电力列表,而是获得了2个圣诞节经典列表..为什么会发生这种情况?我做错了什么?有没有更好的方法来解决这个问题?我正在处理的所有工作站都位于/Station

的相同根位置

我只需要能够指定要带回哪些,我不想要返回100个列表,我只想要我指定的那些....

1 个答案:

答案 0 :(得分:1)

我认为你的代码中只有一个小错误。虽然您有两个不同的节点集nodesnode2,但在两种情况下都会迭代第一个节点集:

for(DDXMLNode* node in nodes)

我建议您将第二个迭代器更改为

for(DDXMLNode* node in node2)

看看会发生什么。