以下xpath找不到节点。这种情况发生在VTD-xml java 2.12和2.13上,而v2.11工作正常。
XML:<CONTACT><ID>10</ID></CONTACT>
Xpath://CONTACT[ID='1']/ID
结果:10
Java单元测试:
@Test
public void testXpath() throws Exception {
String xml = "<CONTACT><ID>10</ID></CONTACT>";
String expression = "//CONTACT[ID='1']/ID";
VTDGen p = new VTDGen();
p.setDoc(xml.getBytes("UTF-8"));
p.parse(false);
VTDNav nav = p.getNav();
AutoPilot pilot = new AutoPilot(nav);
pilot.selectXPath(expression);
int evalXPath = pilot.evalXPath();
if (evalXPath != -1) {
String readValue = nav.toNormalizedString(nav.getText());
Assert.assertEquals("10", readValue);
Assert.fail("evalXpath should have returned -1, but returned " + evalXPath);
}
}
当运行上面的单元测试时,我们得到:
java.lang.AssertionError:evalXpath应该返回-1,但是 返回2。
有谁知道为什么会这样?这是一个已知的错误吗?
我在VTD-xml的论坛上提出了这个问题,但后来发现一条帖子,可以更好地在StackOverflow上询问问题,因此这里有帖子。
编辑2016年11月11日
在回应下面的评论时,请参阅以下2.11失败的测试(当它适用于2.9,2.12和2.13时)
@Test
public void testXmlModifier() throws Exception {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-16\"?><CONTACT><ID>10</ID></CONTACT>";
String expression = "//CONTACT[ID='10']";
String replace = "<CONTACT><ID>11</ID></CONTACT>";
VTDGen p = new VTDGen();
p.setDoc(xml.getBytes("UTF-16"));
p.parse(false);
VTDNav nav = p.getNav();
AutoPilot pilot = new AutoPilot(nav);
pilot.selectXPath(expression);
if (pilot.evalXPath() != -1) {
XMLModifier xm = new XMLModifier(nav);
xm.remove();
xm.insertAfterElement(replace);
/*
* Following call results in IndexOutOfBoundsException
* at java.io.FileOutputStream.writeBytes(Native Method)
* at java.io.FileOutputStream.write(FileOutputStream.java:326)
* at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
* at java.io.PrintStream.write(PrintStream.java:480)
* at com.ximpleware.XMLModifier.output(XMLModifier.java:2068)
*/
xm.output(System.out);
} else {
Assert.fail("Should have found a node by " + expression);
}
}
所以我尝试找到ID为10的CONTACT并将其替换为ID为11的新CONTACT节点。但是,对xm.output
的调用会产生IndexOutOfBoundsException
。
请注意,将上面的XML更改为UTF-8时,代码运行正常。
此外,虽然上面的代码实际上替换了根节点(因为CONTACT是根节点),但在仅替换子节点ID时也存在此问题。因此,使用以下expression
和replace value
运行测试会产生完全相同的错误:
String expression = "//ID[text()='10']";
String replace = "<ID>11</ID>";
答案 0 :(得分:1)
如果您一直在使用2.13版本的vtd-xml ..有一个新版本(2.13_1)可以解决一些报告的错误......
这是一个已经报告并修复的错误...你能从CVS存储库中查看VTDNav.java并进行重新构建吗?
这是指向它的链接..