C # XPATH Выберите атрибут, где внутренний текст дочернего узла - PullRequest
2 голосов
/ 17 августа 2011

У меня есть этот XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<karteikasten>
  <vokabel stufe="1">
    <eng>
      <item>Hi</item>
      <item>Hello</item>
    </eng>
    <de>
      <item>Hallo</item>
      <item>Moin</item>
    </de>
  </vokabel>
  <vokabel stufe="1">
    <eng>
      <item>Eating</item>
    </eng>
    <de>
      <item>Essen</item>
      <item>Mampfen</item>
    </de>
  </vokabel>
</karteikasten>

Я хочу выбрать атрибут "stufe", где <item> - "Hi", "Hello" или что-то еще.У меня есть этот код, который работает:

XPathDocument document = new XPathDocument(@"C:\test.xml");
XPathNavigator navigator = document.CreateNavigator();

XPathExpression expression;
expression = navigator.Compile("/karteikasten/vokabel[eng/item]/@stufe");
XPathNodeIterator iterator = navigator.Select(expression);

while (iterator.MoveNext())
{
  XPathNavigator navigator2 = iterator.Current.Clone();
  Console.WriteLine(navigator2.Value);
}

Но это выбирает каждый "Stufe" во всем документе.

expression = navigator.Compile("/karteikasten/vokabel[eng/item='Hi']/@stufe");

Не работает.Какой правильный шаблон, чтобы получить то, что я хочу?

Ответы [ 2 ]

4 голосов
/ 17 августа 2011

В некоторых синтаксических анализаторах ваше выражение будет фактически работать как написано.В .NET я считаю, что вам нужно использовать функцию text(), например:

/karteikasten/vokabel[eng/item/text()='Hi']/@stufe
0 голосов
/ 17 августа 2011

Попробуйте:

expression = navigator.Compile("/karteikasten/vokabel[eng/item='Hi' and @stufe='1']/@stufe");

, которое должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...