Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回第n个孩子_Java_Xml_Xpath_Vtd Xml - Fatal编程技术网

Java 返回第n个孩子

Java 返回第n个孩子,java,xml,xpath,vtd-xml,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.

使用下面的语句,我得到了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>

gngsfjdsf
2.
2.
斯达达
2.
2.
3214125421
2.
1.
kjhkjtnjy
1.
2.
这是:

/top/level[@sev='4']/item/title/text()
确实返回两个值:

gngsfjdsf
sdadad
因此,您只需要选择第二个,您可以使用括号:

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

sdadad
失败的原因是,
../text()[2]
尝试查找每个已找到节点的第二个文本节点,而不是整个第二个节点


更好的解决方案是选择第二个
节点,而不是仅获取所有匹配节点的第二个
文本()

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

确实返回两个值:

gngsfjdsf
sdadad
因此,您只需要选择第二个,您可以使用括号:

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

sdadad
失败的原因是,
../text()[2]
尝试查找每个已找到节点的第二个文本节点,而不是整个第二个节点


更好的解决方案是选择第二个
节点,而不是仅获取所有匹配节点的第二个
文本()

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

标题元素没有第二个文本节点。因此evalXPath()应该返回一个-1,它应该抛出一个越界异常。

您没有第二个文本节点用于title元素。所以evalXPath()应该返回一个-1,它应该抛出一个越界异常。

对不起,我刚刚意识到我引用了I=1和I=2,然后在示例代码中对值进行了硬编码。我尝试获取第二个值时使用的表达式是/top/level[@sev='4']/item/title/text()[2],但在执行此操作时,我遇到了一个越界错误,尽管该项应该exist@Ben是的,我相信我在回答你真正的问题。我的两个表达式只匹配
sdadad
,正如您所希望的那样。如果没有,请向我们展示1和2的预期输出。我想您希望1使用“gngsfjdsf”,2使用“sdadad”。@Lino在XPath中,数组是基于1的。[1] 获取第一个元素,[2]获取第二个元素。@Lino否!清楚地说“第一个位置是1”。当然!感谢您的第二个示例,您返回的项目[2]正是我要查找的。抱歉,刚刚意识到我引用了I=1和I=2,然后在示例代码中对值进行了硬编码。我尝试获取第二个值时使用的表达式是/top/level[@sev='4']/item/title/text()[2],但在执行此操作时,我遇到了一个越界错误,尽管该项应该exist@Ben是的,我相信我在回答你真正的问题。我的两个表达式只匹配
sdadad
,正如您所希望的那样。如果没有,请向我们展示1和2的预期输出。我想您希望1使用“gngsfjdsf”,2使用“sdadad”。@Lino在XPath中,数组是基于1的。[1] 获取第一个元素,[2]获取第二个元素。@Lino否!清楚地说“第一个位置是1”。当然!感谢您的第二个示例,您返回的项[2]正是我要查找的。您需要测试evalXPath返回值为-1的条件。您需要测试evalXPath返回值为-1的条件。。