【发布时间】:2016-10-03 20:26:12
【问题描述】:
我一直在使用 VTD-XML 来运行 xpath 表达式,但我发现任何比使用文件类型地址(即 //Books/authors)更复杂的 XPath 表达式都会出现故障,并且只是求助于返回整个文件。
我有两个例子,一个使用 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)]
这应该返回“a”标签,因为有一个包含“jumps”的“e”标签。但相反,这没有返回任何内容。
用于第二期的 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));
}
【问题讨论】:
-
请下载最新的jar文件,当它发布时......这很快......
-
我将 jar 添加到我的项目中,但它仍然给我完全相同的结果。我什至尝试将 jar 重命名为 2.12,以便它与它所在的文件夹具有相同的名称,但没有任何改变。不过感谢 parseFile 的建议,它更干净了。
-
我认为您可能有全局类路径设置问题...您的代码在我的 eclipse 环境中运行良好...您是在 eclipse 中运行它还是在命令提示符下运行它?
-
我在 Eclipse Mars 上运行它
-
所以我将类路径设置为这样; “设置类路径=C:\Users\myusername\Desktop\ximpleware-2.12-java\vtd-xml.jar;C:\Users\myusername\Desktop\ximpleware-2.12-java\vtd-xml_2.13.jar;.; "然后我导航到我的 testvtd.java 文件所在的位置,并以“javac testvtd.java”后跟“java testvtd”的方式运行它。我确保将您发送给我的新 jar 文件包含到 xipleware 文件夹中,这就是它被命名为 vtd-xml_2.13.jar 的原因。但我仍然得到完全相同的结果:(有什么想法吗?
标签: xml xpath contains concat vtd-xml