xPath以获取具有特定值的元素的同级值
本文关键字:元素 获取 xPath | 更新日期: 2023-09-27 18:00:23
给定此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获得抽奖号码。例如,如果我指定游戏ID 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对象。node变量以一个null值结束,这似乎表明没有找到匹配项。
这里是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");
使用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>
,否则它将返回空