我使用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做错了什么吗?
发布于 2018-06-27 11:03:48
当您使用VTD-XML解析完xml时,VTDNav的默认游标位置是根元素节点。在您的示例中,它位于根节点。因此,当您运行xpath "ROOT/STUDENT(not(DATE) or DATE='')/NAME“时,实际上是在查询/ROOT/ROOT/STUDENT/NAME节点。
最简单的更正是将日期更改为学生(而不是( xpath )或DATE='')/NAME,这是一个相对XPath。
或者您可以使用绝对xpath /ROOT//NAME(不是(DATE)或DATE=‘’)日期。
或者,您可以首先调用VTDNav的toElement()方法,并给它一个"PARENT“参数,以便将光标移动到文档节点……它也会起作用的
在我这方面进行了几次测试之后,我发现这是VTDNav类中一个名为的方法的错误
XPathStringVal_Matches(int j,String s);
你愿意剪切/粘贴一些代码来纠正这个bug吗?
我会为你提供指导,非常简单的修复…
https://stackoverflow.com/questions/51018643
复制相似问题