这是我昨天发布的一个问题的后续跟进。
鉴于下面发布的汽车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>
这个问题之前已经发布过,这只是一个更简洁的例子和代码。标题也更具体。
答案 0 :(得分:4)
您所看到的是查询“// name”的正确行为。您应该使用相对于当前节点的查询,而不是文档的根目录 - 这就是您正在做的事情。
查看有用的XPath教程http://www.w3schools.com/xpath/