xPath获取具有特定值的元素的兄弟值

1 c# xml xpath

鉴于此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>
Run Code Online (Sandbox Code Playgroud)

我需要根据特定的gameId得到抽奖号码.例如,如果我指定gameID L649,我需要获得3035.

以下内容适用于多个在线评估者,但不适用于C#.它说它找不到它.建议?

/InitResponse/GameInfoList/GameInfo/Draw/draw[preceding-sibling::gameId='L649']
Run Code Online (Sandbox Code Playgroud)

C#代码我尝试过:

XmlNode node = xmlDoc.SelectSingleNode("/InitResponse/GameInfoList/GameInfo/Draw/draw[preceding-sibling::gameId='L649']");
Run Code Online (Sandbox Code Playgroud)

...其中xmlDoc是一个用xml加载的xmlDocument对象.节点变量以null值结束,这似乎表明找不到匹配项.

Ser*_*kiy 5

这是xpath(与Linq)

var xdoc = XDocument.Load(path_to_xml);
string xpath = "/InitResponse/GameInfoList/GameInfo/Draw[gameId='L649']/draw";
var draw = xdoc.XPathSelectElement(xpath);
if (draw != null) // check if draw with gameId found in xml
    value = (int)draw;
Run Code Online (Sandbox Code Playgroud)

你也可以使用纯Linq到Xml(但在这种情况下,xpath看起来更紧凑):

var draw = xdoc.Descendants("GameInfo")
               .SelectMany(g => g.Elements("Draw"))
               .SingleOrDefault(d => (string)d.Element("gameId") == "L649");
if (draw != null)
    value = (int)draw.Element("draw");
Run Code Online (Sandbox Code Playgroud)