如何根据兄弟节点中的文本值查找兄弟xml节点的文本?

时间:2011-06-22 06:35:45

标签: xml xpath

假设:

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

如何构建一个xpath来返回其文本值为200的节点/param/data/value/string?基本上我想只搜索其中一个兄弟value文本包含./value/string的兄弟ErrorCode元素?

4 个答案:

答案 0 :(得分:3)

您应该使用此XPath表达式:

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

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

答案 1 :(得分:0)

C#版本:

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

答案 2 :(得分:0)

尝试以下Xpath

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

答案 3 :(得分:0)

对于那些感兴趣的人,我有一个非常相似的需求,并且必须略有不同。

如果基于另一个兄弟的同一节点中的兄弟,我需要获取该值。所以,在下面的例子中,我需要根据特定的gameId获得抽奖号码

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>

我需要使用以下语法。它适用于几个在线xPath评估器,但我在C#中遇到了麻烦,不得不使用不同的方法。

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