我正在使用VTD-XML解析器从具有给定路径的XML获取值。在我的Java代码下面。
VTDGen vg = new VTDGen();
vg.setDoc(xml.getBytes());
vg.parse(true);
VTDNav vn = vtdGen.getNav();
AutoPilot ap = new AutoPilot(vn);
xpath="ROOT/STUDENT[(not(DATE) or DATE='')]/NAME";
ap.selectXPath(xpath);
while(ap.evalXPath() != -1) {
long l = vn.getContentFragment();
value= vn.toString((int )l, (int)(l>>32));
}
我的xml看起来像这样。
<ROOT>
<STUDENT>
<NAME>John</NAME>
<DATE>12-JUNE-18</DATE>
</STUDENT>
<STUDENT>
<NAME>Peter</NAME>
<DATE/>
</STUDENT>
</ROOT>
我想使用XPATH选择peter名称。该xpath可用于xsl转换,但不适用于VTD-XML。
我的解析或XPATH有什么问题吗?
答案 0 :(得分:0)
用VTD-XML完成xml解析后,VTDNav的默认光标位置在根元素节点上。在您的情况下,它位于ROOT节点。因此,当您运行xpath“ ROOT / STUDENT [(not(DATE)或DATE ='')] / NAME”时,实际上是在查询 / ROOT / ROOT / STUDENT / NAME节点。
最简单的纠正方法是将XPath更改为STUDENT [(not(DATE)或DATE ='')] / NAME,这是相对的xpath。
或者您可以使用绝对xpath / ROOT / STUDENT [(not(DATE)或DATE ='')] / NAME。
或者您可以首先调用VTDNav的toElement()方法并为其赋予“ PARENT”参数,以将光标移至文档节点...它也将起作用
经过几次测试后,我发现这是VTDNav类内的方法中的一个错误
XPathStringVal_Matches(int j,String s);
您是否愿意剪裁/粘贴一些代码来纠正错误?
我将为您提供指导,非常容易修复...