1

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

特定の gameId に基づいて抽選番号を取得する必要があります。たとえば、gameID L649 を指定した場合、3035 を取得する必要があります。

以下は、いくつかのオンライン エバリュエーターで機能しますが、C# では機能しません。見つからないと言われています。提案?

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

私が試したC#コード:

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

... ここで、xmlDoc は、xml とともにロードされた xmlDocument オブジェクトです。ノード変数は、一致が見つからなかったことを示すように見える null 値で終了します。

4

2 に答える 2

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;

また、純粋な Linq to 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");
于 2013-02-20T21:06:57.207 に答える