2011-06-22 255 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> 

我如何構建一個XPath返回我的節點/param/data/value/string其中它的文本值是200?基本上我想搜索只有兄弟value元素其中一個兄弟./value/string文本包含ErrorCode

回答

0

C#版本:

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

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

你應該使用這個XPath表達式:如果你的價值觀的順序總是相同的

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

,您可以刪除聯合運算符並僅使用謂詞的一部分。

0

對於那些有興趣的人,我有一個非常相似的需求,不得不略微不同。

我需要獲取值,如果兄弟姐妹在同一個節點基於另一個兄弟。因此,在下面的例子中,我需要得到基於特定的遊戲ID

XML抽獎號碼:

<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> 

我需要使用下面的語法。它可以在幾個在線xPath評估器中工作,但我在C#中遇到了麻煩,必須使用其他方法。

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