【问题标题】:Does VTD-XML allow complex xpath expressions?VTD-XML 是否允许复杂的 xpath 表达式?
【发布时间】: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


【解决方案1】:

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

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)上进行了第二次测试,它工作正常并返回单个节点...

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

【讨论】:

  • 所以我已经替换了 Ximpleware 文件夹副本中的 LocationPathExpr.java 文件,而不是在配置我的 PATH 以运行 javac 和 jar 之后,我运行了 build.bat 文件,该文件更新了“vtd-xml- 2-12.jar”罐子。然后我将它复制到我的工作文件夹并运行代码,但它仍然给了我完全相同的结果。
  • 您是否移除了旧的 jar 并用新的 jar 替换它?如果这不起作用,让我在我这边做一个构建,然后放一个 jar 供你下载……会给你一个 URL 链接,它几乎是 v2.13 计划发布的负责人
  • 是的,我从我的工作目录中删除了旧 jar,我没有从 Ximpleware 文件夹中删除它。然而,其中一个罐子被修改了。是的,我真的很感激!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2019-10-30
  • 2013-07-24
  • 1970-01-01
相关资源
最近更新 更多