我一直在使用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));
}
答案 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),它运行正常并返回一个节点......
它们似乎与同一个错误相关......