VTD2.13发现错误的节点,该节点使用节点值上的条件计算xpath
下面的xpath找到了一个节点,但它不应该找到。VTDMXMLJava2.12和2.13会出现这种情况,而v2.11工作正常 XML:VTD2.13发现错误的节点,该节点使用节点值上的条件计算xpath,xpath,vtd-xml,Xpath,Vtd Xml,下面的xpath找到了一个节点,但它不应该找到。VTDMXMLJava2.12和2.13会出现这种情况,而v2.11工作正常 XML:10 Xpath://联系[ID='1']/ID 结果:10 Java单元测试: @Test public void testXpath() throws Exception { String xml = "<CONTACT><ID>10</ID></CONTACT>"; String express
10
Xpath://联系[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);
}
}
如果您一直在使用vtd xml的2.13版本。。有一个新版本(2.13_1)可以解决一些报告的bug 这是一个已报告并已修复的错误。。。您能从CVS存储库中签出VTDNav.java并重新构建吗 这是它的链接
非常感谢您的快速响应,只需在我的项目中的com.simpleware包中放入固定的VTDNav就可以了!顺便说一句,在这里发布之前,我已经搜索了错误报告,但没有找到任何错误报告…下次我可以在哪里查找已知错误?我是否需要修补更多文件,因为下面的xpath现在可以找到ID为10的联系人,而它不应该找到任何内容:
//Contact[ID!=“10”]/ID
您能用更多细节来扩展您的发现吗?我认为这可能是一个未被发现的新错误…谢谢你的回复,请告诉这里,当这个错误被修复。如果你能对2.13的稳定性说点什么的话,我也很高兴知道,因为现在我们将继续使用2.9(我们在2.11中也遇到了一些其他问题)。我将做一个2.13.1的修复,然后发布相当快的版本,新版本已经完成,最新jar的URL发布在下面
@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);
}
}
String expression = "//ID[text()='10']";
String replace = "<ID>11</ID>";