VTD 2.13发现错误的节点在节点值

时间:2016-11-09 12:43:52

标签: xpath vtd-xml

以下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时也存在此问题。因此,使用以下expressionreplace value运行测试会产生完全相同的错误:

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

1 个答案:

答案 0 :(得分:1)

如果您一直在使用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并进行重新构建吗?

这是指向它的链接..

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