Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
VTD2.13发现错误的节点,该节点使用节点值上的条件计算xpath_Xpath_Vtd Xml - Fatal编程技术网

VTD2.13发现错误的节点,该节点使用节点值上的条件计算xpath

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

下面的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 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>";