Вернуть n-го ребенка

Используя следующее утверждение, я получаю валидный ответ для i = 1, но при попытке i = 2 и т. Д. Я получаю исключение массива за пределами границ, любые указатели будут хороши!

AutoPilot resultNode = new AutoPilot();
resultNode.selectXPath("/top/level[@sev='4']/item/title/text()[i]");
resultNode.bind(vn);
int z = resultNode.evalXPath();
System.out.println("TEST: "+vn.toString(z));

Пример XML:

<top>
  <level sev="4">
    <item>
      <title>gngsfjdsf</title>
      <p1>2</p1>
      <p2>2</p2>
    </item>
    <item>
      <title>sdadad</title>
      <p1>2</p1>
      <p2>2</p2>
    </item>
  </level>
  <level sev="3">
    <item>
      <title>3214125421</title>
      <p1>2</p1>
      <p2>1</p2>
    </item>
    <item>
      <title>kjhkjtnjy</title>
      <p1>1</p1>
      <p2>2</p2>
    </item>
  </level>
</top>

2 ответа

Решение

Это:

/top/level[@sev='4']/item/title/text()

действительно возвращает два значения:

gngsfjdsf
sdadad

Таким образом, вам нужно выбрать только второй, и вы можете сделать это с помощью скобок:

(/top/level[@sev='4']/item/title/text())[2]

только возвращается

sdadad

Причина вашей неудачи в том, что .../text()[2] пытается найти второй текстовый узел каждого из найденных узлов, а не общий второй узел.


Еще лучшим решением является выбор второго item узел вместо того, чтобы пытаться получить только второй text() узел всех совпадающих узлов...

/top/level[@sev='4']/item[2]/title/text()

У вас нет второго текстового узла для элемента заголовка. поэтому evalXPath() должен возвращать -1, который должен генерировать исключение вне границы.

Другие вопросы по тегам