有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java VTD XML内部XPath表达式

例如,我有一个xml文件,如下所示

<root>
 <test>
  <bla>test1</bla>
 </test>
 <test>
  <bla>test2</bla>
 </test>
 <test>
 </test>
</root>

现在我想通过使用XPath表达式使用vtd xml解析器解析它。首先,我通过

VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("//test");

现在我想在这个test标记中搜索bla标记

int result = -1;
int count = 0;

while ((result = ap.evalXPath()) != -1) {
 // evaluate XPath Expressions within the test tags
}

有人能告诉我怎么表达吗?我不想在整个文档中搜索bla标记,因为我希望能够将bla标记分配给test标记。例如,如果bla标记为空,并且我在整个文档中搜索bla标记,则无法执行此操作


共 (4) 个答案

  1. # 1 楼答案

    下面是使用2个XPath的替代方案。仅使用一个xpath获取“test”标记,然后使用循环遍历其子级以查找“bla”标记

    VTDNav vn = vg.getNav();
    AutoPilot ap = new AutoPilot(vn);
    ap.selectXPath("//test");
    
    while (ap.evalXPath() != -1) {
        System.out.println("Inside Test tag");
    
        //now find the children called "bla"
        if(vn.toElement(VTDNav.FIRST_CHILD, "bla")){
        do{
            int val = vn.getText() ;
            if(val!=-1){
            String value = vn.toNormalizedString(val);
            System.out.println("\tFound bla: " + value);
            }
        }
        while(vn.toElement(VTDNav.NEXT_SIBLING, "bla"));
        }
        //move back to parent
        vn.toElement(VTDNav.PARENT);
    }
    
  2. # 2 楼答案

    开头的段落似乎表明你想要这样:

    //test/bla
    

    然而,结尾的段落似乎表明你想要一些不同的东西

  3. # 3 楼答案

    您可以声明另一个自动驾驶仪(如下所示),尽管它并不总是最简单的方法

    AutoPilot ap2 = new AutoPilot(); ap2.selectXPath("blah");
    

    然后将其嵌套在循环中

    while ((result = ap.evalXPath()) != -1) {
     // evaluate XPath Expressions within the test tags
      int i2=-1;
      while((i2=ap2.evalXPath())!=-1){
         // do more stuff here
      }
    }
    

    但问题是第二个xpath需要是相对的xpath表达式

  4. # 4 楼答案

    对于学习VTD-XML的人来说,这里有一篇由VTD开发人员自己撰写的关于如何编程的优秀文章

    在主页上找不到这个,但它对启动有很大帮助