VTD-XML是否允许复杂的xpath表达式?

时间:2016-06-03 17:08:27

标签: xml xpath contains concat vtd-xml

我一直在使用VTD-XML来运行xpath表达式,但我发现任何XPath表达式比使用文件类型地址(即// Books / authors)更复杂,并简单地转向返回整个文件。

我有两个例子,一个使用concat()方法,另一个使用contains()方法。

我的 test.xml 文档:

<a>
  <b>The</b>
  <c>fox</c>
  <d>
    <e>jumps</e>
  </d>
</a>

第一期

运行这样的连接时遇到问题:

concat(//b, ' ', //c, ' ', '- Found: ', \"'\", //d/e, \"'\")

这应该返回:

The fox - Found: 'jumps'

但是返回:

Thefoxjumps Thefoxjumps - Found: 'Thefoxjumps'

VTD用于第一期

File f = new File("C:/Users/../test.xml");
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[(int) f.length()];
fis.read(b);

VTDGen vg = new VTDGen();
vg.setDoc(b);
vg.parse(true);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("concat(//b, ' ', //c, ' ', '- Found: ', \"'\", //d/e, \"'\")");

System.out.println(ap.evalXPathToString());

第二期

当我运行像这样的包含时:

//a[contains('|jumps|runs|', d/e)]

这应该返回&#34; a&#34;标签,因为有一个&#34; e&#34;包含&#39;跳转的标记&#39;。但相反,这没有任何回报。

用于第二期的VTD代码

File f = new File("C:/Users/../test.xml");
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[(int) f.length()];
fis.read(b);

VTDGen vg = new VTDGen();
vg.setDoc(b);
vg.parse(true);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
int r;
while((r = ap.evalXPath()) != -1){
    System.out.println("Tag: "+vn.toString(r));
}

1 个答案:

答案 0 :(得分:0)

对于第一个问题,我在最新版本上运行查询...它返回

The fox - Found: 'jumps'

看来遗憾的是2.12中引入的错误已经报告并修复了......请注意它应该在2.10或2.11中正常工作

转到http://vtd-xml.cvs.sourceforge.net/viewvc/vtd-xml/ximple-dev/com/ximpleware/LocationPathExpr.java?revision=1.64并下载文件 使用与发行版捆绑在一起的build.bat脚本自己构建一个jar ...

我还在最新版本上运行了第二次测试(定于2.13),它运行正常并返回一个节点......

它们似乎与同一个错误相关......