首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VTD-XML:仅关闭标记检查无效

VTD-XML:仅关闭标记检查无效
EN

Stack Overflow用户
提问于 2018-06-25 15:57:06
回答 1查看 182关注 0票数 1

我使用VTD-XML解析器从给定路径的XML中获取值。在我的java代码下面。

代码语言:javascript
复制
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是这样的。

代码语言:javascript
复制
<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做错了什么吗?

EN

回答 1

Stack Overflow用户

发布于 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吗?

我会为你提供指导,非常简单的修复…

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51018643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档