2011-06-28 80 views
1

这是我昨天发布的问题的后续操作。Objective-C nodesForXPath返回所有结果

鉴于下面发布的汽车XML示例,我运行了一个xpath查询,循环遍历结果并使用子元素调用“quickquery - getString”。我期望在循环的每次迭代中,我都会在getString函数中获得一个单独的元素,但是我没有。相反,在getString函数内部的nodesForXPath调用将返回所有4个汽车名称,而不仅仅是属于该子元素的名称。

NSArray *listings = [response nodesForXPath:@"//car" error:&error]; 

//4 car elements found   
if(listings.count > 0) 
{ 
    for (GDataXMLElement *listingElement in listings) 
    { 
     //printing listingElements description at this point reveales only one car 
     [QuickQuery getString:listingElement fromXPath:@"//name"]; 
    } 
} 

//this is defined in QuickQuery class 
+(NSString *) getString:(GDataXMLElement *)element fromXPath:(NSString *)xPath 
{ 
    NSError *error; 
    //Query the name element for the spcific car element passed in 
    NSArray *result = [element nodesForXPath:xPath error:&error]; /// ***THIS CALL 

    //result.count is 4 at this stage ("BMW", "VW" ... etc) 
    //out of the 4 calls made to this method, I would expect each value to come up once 
    //but each time all 4 values are found. 
    if(result.count > 0) 
    { 
     GDataXMLElement *singleValue = (GDataXMLElement *) [result objectAtIndex:0]; 
     return singleValue.stringValue; 
    } 
    return nil; 
} 


<cars> 
    <car> 
    <name>VW</name> 
    </car> 
    <car> 
    <name>BMW</name> 
    </car> 
    <car> 
    <name>Mazda</name> 
    </car> 
    <car> 
    <name>Nissan</name> 
    </car> 
</cars> 

这个问题已经发布之前,这只是一个更清晰的例子和代码。标题也更具体。

回答

4

你所看到的是查询“//名称”的正确行为。您应该使用与当前节点相关的查询,而不是文档的根目录 - 这正是您正在做的。

看看有用的XPath教程http://www.w3schools.com/xpath/

+0

OMW ...我想你实际上已经钉它。今晚我会回家测试,让你知道它是怎么回事。谢谢。 – Craigt

+2

感谢您的答案..我将查询更改为./name,现在它完美工作。 – Craigt