vtd-xml evalXPathToString 是否以 text() 结尾

vtd-xml evalXPathToString with text() at the end or not

我想弄清楚应该如何对 evalXPathToString 方法进行编码,以允许我在末尾使用 text() 的 xpath:

String xml = <xmlDoc><noele>junk</noele><valss>1.45</valss><other>junk2</other></xmlDoc>   

assertThat(evalXPathToString(xml, "/xmlDoc/valss"), is("1.45"));
assertThat(evalXPathToString(xml, "/xmlDoc/noele"), is("junk"));
assertThat(evalXPathToString(xml, "/xmlDoc/other/text()"), is("junk2"));

vtd-xml.

2.13 版

编辑我所拥有的:

autoPilot.selectXPath(xpath);

if(hasMoreElements(autoPilot)) {
    int textIndex = vtdNav.getText() ;
    if(textIndex != -1) {
        return vtdNav.toNormalizedString(textIndex);
    }
}

...但最后的断言没有通过。

当您直接使用 xpath 查询文本值(具体来说,将 text() 作为最后一步)时,无需在断言代码中调用额外的 getText()。原因是/xmlDoc/other/text()已经returns 文本节点或-1。如果你在该节点位置 运行 getText() ,你将始终为 -1,因为你正在尝试获取文本节点的文本节点。

所以修复是:

  1. 运行 '/xmlDoc/other' 的 xpath 查询,然后测试 is() 的断言。你的逻辑会起作用
  2. 运行 '/xmlDoc/other/text(),' 的 xpath 查询并测试 -1 的 return 值或直接检查字符串值。

一个额外的性能增强建议:不需要 vtd 索引到字符串的转换...vtdNav 有一组函数可以直接将 vtd 标记与字符串值进行比较...其中一个称为 vtdNav.comparetokenString()