Вернуть 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, который должен генерировать исключение вне границы.