VTD 2.13 发现错误的节点根据节点值条件评估 xpath

VTD 2.13 finds the wrong node evaluating xpath with condition on node value

以下 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 should have returned -1, but returned 2.

有谁知道为什么会这样?这是已知错误吗?

我在 VTD-xml 的论坛上问过这个问题,但后来注意到 post 问题最好在 Whosebug 上提问,因此 post 在这里。


编辑 2016 年 11 月 14 日

作为对以下评论的回应,请查看以下在 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 时也存在此问题。因此 运行 使用以下 expressionreplace value 的测试给出完全相同的错误:

String expression = "//ID[text()='10']";
String replace = "<ID>11</ID>";

如果您一直在使用 2.13 版本的 vtd-xml.. 有一个新版本 (2.13_1) 可以解决一些报告的错误...

https://sourceforge.net/projects/vtd-xml/files/vtd-xml/ximpleware_2.13_1/ximpleware-2.13.1-java.zip/download

这是一个已报告并已修复的错误...您可以从 CVS 存储库中检出 VTDNav.java 并重新构建吗?

这是link..

http://vtd-xml.cvs.sourceforge.net/viewvc/vtd-xml/ximple-dev/com/ximpleware/VTDNav.java?revision=1.146