VTD-XML xpath with != 不再工作

VTD-XML xpath with != is not working anymore

自从我们更新库以来,我已经面临这个问题 2 天了。我们有很多这种 xpath:

/root/temp[@attr!='abcd']

自从我们将库更新到 2.13 后,这些就不再起作用了。这些在 2.11 版本中工作正常,但在 >=2.12 版本中它们不再工作。问题很容易重现:

String test = "<root><attr temp='abcde'></attr></root>";
VTDGen vg = new VTDGen();
vg.setDoc(test.getBytes());
vg.parse(false);
VTDNav vn = vg.getNav();

AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/root/attr[@temp!='abcd']");
System.out.println(ap.evalXPath());//expecting a positive int, get -1 instead

我们已经因为另一个错误而更新了,但现在我们真的被这个问题困住了。有任何想法吗?我们可以使用另一种语法来绕过这个错误吗?我们尝试使用 /root/attr[not(@temp='abcd')] 并且它正在处理这个简单的案例,但我们不确定这对涉及“!= as 运算符的每个 xpath 是否有效。

请注意 2.11 即使使用像 /root/attr[@temp!=''] 这样的 xpath 也能正常工作,在那个版本之后似乎 != 运算符被破坏了,至少对于我们习惯的使用来说是这样。

编辑: 我们不使用 "not" 语法的原因是因为在这种情况下

<root>
    <nodes> 
        <node attr="1" />
        <node attr="2" />
        <node attr="3" />
    </nodes>
    <nodi>
        <nodo attr="1" />
        <nodo attr="2" />
        <nodo attr="3" />
    </nodi>
</root>

这些 xpaths:

/root/nodes/node[@attr!=/root/nodi/nodo/@attr]

/root/nodes/node[不是(@attr=/root/nodi/nodo/@attr)]

return 不同的结果。我知道这是一个非常微不足道的例子,只是我们不能真的通过简单的查找和替换来确定所有的东西都按预期工作。我刚刚深入研究了源代码,我注意到解析器只是将 !在 xpath 表达式之外。

我将您的代码粘贴到我的 eclipse 编辑器中,得到的答案是 2.. 而不是您指出的 -1...

所以我只能说你没有得到最新版本,即 2.13.1。

请你去 vtd-xml 网站获取版本。

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

编辑:请转到 cvs 存储库并下载此 parser.java 文件...这就是我修复的地方...确保您有...

http://vtd-xml.cvs.sourceforge.net/viewvc/vtd-xml/ximple-dev/com/ximpleware/xpath/parser.java?revision=1.33

编辑:我已将此错误的修复程序作为版本 2 发布。13_2 今天发布了..