如何根据同级xml节点中的文本值查找同级xml节点的文本?

如何根据同级xml节点中的文本值查找同级xml节点的文本?,xml,xpath,Xml,Xpath,鉴于: 错误代码 200 描述 年龄组 如何构造xpath以返回文本值为200的节点/param/data/value/string?基本上,我只想搜索同级value元素,其中一个同级/value/string文本包含ErrorCode?C>版本: string s=@” 错误代码 200 描述 年龄组 "; XDocument xdoc=XDocument.Parse; foreach(xdoc.XPathSelectElements(“/param/data/value[string='

鉴于:


错误代码
200
描述
年龄组
如何构造xpath以返回文本值为200的节点
/param/data/value/string
?基本上,我只想搜索同级
value
元素,其中一个同级
/value/string
文本包含
ErrorCode

C>版本:

string s=@”
错误代码
200
描述
年龄组
";
XDocument xdoc=XDocument.Parse;
foreach(xdoc.XPathSelectElements(“/param/data/value[string='ErrorCode']”)中的var elem)
{
XName value=XName.Get(“值”);
foreach(elem.ElementsBeforeSelf(value).Union(elem.ElementsAfterSelf(value)).Select(el=>el.XPathSelectElement(“字符串”).value)中的var res)
控制台写入线(res);
}

尝试以下Xpath

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);
}

您应该使用以下XPath表达式:

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

如果值的顺序始终相同,则可以删除union运算符并仅使用谓词的一部分

对于那些感兴趣的人,我有一个非常相似的需求,并且不得不稍微改变一下

如果同一节点中的某个同级节点基于另一个同级节点,则需要获取该值。因此,在下面的示例中,我需要根据特定的gameId获得抽签编号

XML:

//param/data/value[string='ErrorCode']/following-sibling::value/string | //param/data/value[string='ErrorCode']/preceding-sibling::value/string 
/param/data/value/string[../preceding-sibling::value[string='ErrorCode']|../following-sibling::value[string='ErrorCode']]
<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>
/InitResponse/GameInfoList/GameInfo/Draw/draw[preceding-sibling::gameId='L649']