Как мне найти текст узла xml на одном уровне в зависимости от значения текста в его узле? - PullRequest
1 голос
/ 22 июня 2011

Дано:

<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 для возврата мне узла /param/data/value/string, где его текстовое значение равно 200? В основном, я хочу искать только элементы одного уровня value, в которых один из его элементов типа ./value/string содержит ErrorCode?

Ответы [ 4 ]

3 голосов
/ 22 июня 2011

Вы должны использовать это выражение XPath:

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

Если порядок ваших значений всегда одинаков, вы можете удалить оператор объединения и использовать только одну часть предиката.

0 голосов
/ 21 февраля 2013

Для тех, кто заинтересован, у меня была очень похожая потребность, и я должен был сделать это немного по-другому.

Мне нужно было получить значение, если один брат в том же узле основан на другом брате.Итак, в следующем примере мне нужно было получить номер розыгрыша на основе определенного идентификатора игры

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']
0 голосов
/ 22 июня 2011

Попробуйте следующий Xpath

//param/data/value[string='ErrorCode']/following-sibling::value/string | //param/data/value[string='ErrorCode']/preceding-sibling::value/string 
0 голосов
/ 22 июня 2011

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...