1

昨日投稿した質問の続きです。

以下に投稿された車の XML の例を考えて、xpath クエリを実行し、結果をループして、サブ要素で "quickquery - getString" を呼び出します。ループの反復ごとに、getString 関数内で 1 つの要素を取得することを期待しますが、そうではありません。代わりに、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

1 に答える 1

4

表示されているのは、クエリ「//name」の正しい動作です。ドキュメントのルートではなく、現在のノードに相対的なクエリを使用する必要があります-これがあなたがしていることです。

便利な XPath チュートリアルhttp://www.w3schools.com/xpath/をご覧ください。

于 2011-06-28T10:27:03.717 に答える