2013-02-20 84 views
1

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> 

我需要根据特定的游戏ID抽奖号码。例如,如果我指定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对象。节点变量以空值结束,这似乎表明没有找到匹配。

+1

您应该使用'XPath' – MethodMan 2013-02-20 21:07:39

回答

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到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"); 
1

使用XmlDocument的

我没有看到你的XPath声明中有什么问题,请看以下内容:

(所以我想还有别的东西,是错误的)

XmlDocument myDoc = new XmlDocument(); 

String str = @"<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>"; 

      myDoc.LoadXml(str); 

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

从结果返回的节点是:3035

注:你的第一个音符必须<InitResponse>否则会返回null