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 时也存在此问题。因此 运行 使用以下 expression
和 replace value
的测试给出完全相同的错误:
String expression = "//ID[text()='10']";
String replace = "<ID>11</ID>";
如果您一直在使用 2.13 版本的 vtd-xml.. 有一个新版本 (2.13_1) 可以解决一些报告的错误...
这是一个已报告并已修复的错误...您可以从 CVS 存储库中检出 VTDNav.java 并重新构建吗?
这是link..
以下 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 时也存在此问题。因此 运行 使用以下 expression
和 replace value
的测试给出完全相同的错误:
String expression = "//ID[text()='10']";
String replace = "<ID>11</ID>";
如果您一直在使用 2.13 版本的 vtd-xml.. 有一个新版本 (2.13_1) 可以解决一些报告的错误...
这是一个已报告并已修复的错误...您可以从 CVS 存储库中检出 VTDNav.java 并重新构建吗?
这是link..