2011-06-22 13 views
1

は考える:兄弟ノードのテキスト値に基づいて兄弟XMLノードのテキストを検索するにはどうすればよいですか?

<param> 
<data> 
    <value><string>ErrorCode</string></value> 
    <value><string>200</string></value> 
</data> 
<data> 
    <value><string>Desc</string></value> 
    <value><string>Age group</string></value> 
</data> 
</param> 

どのように私は私にそのテキスト値が200であるノード/param/data/value/stringを返すためにXPathを構築することができますか?基本的には、兄弟valueの要素のみを検索したいのですが、兄弟./value/stringのテキストにはErrorCodeが含まれていますか?

答えて

0

C#バージョン:、自分の価値観の順序は常に同じである場合

/param/data/value/string[../preceding-sibling::value[string='ErrorCode']|../following-sibling::value[string='ErrorCode']] 

string s = @" 
<param> 
<data> 
    <value><string>ErrorCode</string></value> 
    <value><string>200</string></value> 
</data> 
<data> 
    <value><string>Desc</string></value> 
    <value><string>Age group</string></value> 
</data> 
</param>"; 

XDocument xdoc = XDocument.Parse(s); 

foreach (var elem in xdoc.XPathSelectElements("/param/data/value[string='ErrorCode']")) 
{ 
    XName value = XName.Get("value"); 
    foreach (var res in elem.ElementsBeforeSelf(value).Union(elem.ElementsAfterSelf(value)).Select(el => el.XPathSelectElement("string").Value)) 
     Console.WriteLine(res); 
} 
0

は、次のXPath

あなたはこのXPath式を使用する必要があります
//param/data/value[string='ErrorCode']/following-sibling::value/string | //param/data/value[string='ErrorCode']/preceding-sibling::value/string 
3

をお試しください結合演算子を削除して、述部の一部のみを使用することができます。

0

私は非常によく似たニーズがあり、やや異なったやり方が必要でした。

別の兄弟に基づいて同じノード内の兄弟が値を取得する必要がありました。私は、次の構文を使用するために必要な

<InitResponse> 
    <LottoToken>908ec70b308adf10d04db1478ef9b01b</LottoToken> 
    <GameInfoList> 
    <GameInfo> 
     <Draw> 
     <gameId>L649</gameId> 
     <draw>3035</draw> 
     </Draw> 
    </GameInfo> 
    <GameInfo> 
     <Draw> 
     <gameId>BC49</gameId> 
     <draw>2199</draw> 
     </Draw> 
    </GameInfo> 
    </GameInfoList> 
</InitResponse> 

:だから、次の例では、私は特定のgameIdに基づいて描画番号を取得するために

XMLを必要としていました。いくつかのオンラインxPathエバリュエーターで動作しますが、C#で問題があり、別の方法を使用しなければなりませんでした。

/InitResponse/GameInfoList/GameInfo/Draw/draw[preceding-sibling::gameId='L649']