回到第n个孩子

时间:2017-12-21 17:11:50

标签: java xml xpath vtd-xml

使用以下语句我得到了i = 1的valis响应,但是当我尝试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 个答案:

答案 0 :(得分:3)

此:

/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()

答案 1 :(得分:1)

你没有title元素的第二个文本节点。所以evalXPath()应该返回-1,它应该抛出一个超出范围的异常。