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,因为你正在尝试获取文本节点的文本节点。
所以修复是:
- 运行
'/xmlDoc/other'
的 xpath 查询,然后测试 is() 的断言。你的逻辑会起作用
- 运行
'/xmlDoc/other/text(),'
的 xpath 查询并测试 -1 的 return 值或直接检查字符串值。
一个额外的性能增强建议:不需要 vtd 索引到字符串的转换...vtdNav 有一组函数可以直接将 vtd 标记与字符串值进行比较...其中一个称为 vtdNav.comparetokenString()
我想弄清楚应该如何对 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,因为你正在尝试获取文本节点的文本节点。
所以修复是:
- 运行
'/xmlDoc/other'
的 xpath 查询,然后测试 is() 的断言。你的逻辑会起作用 - 运行
'/xmlDoc/other/text(),'
的 xpath 查询并测试 -1 的 return 值或直接检查字符串值。
一个额外的性能增强建议:不需要 vtd 索引到字符串的转换...vtdNav 有一组函数可以直接将 vtd 标记与字符串值进行比较...其中一个称为 vtdNav.comparetokenString()