VTD-XML Java代码只获取第一个元素

时间:2013-12-07 01:37:58

标签: java xml xpath vtd-xml

XML文档:

<?xml version="1.0" encoding="utf-8"?>
<vdsDataSet>
  <date>1900-01-01</date>
  <vdsData>
    <contractId>contractId1</contractId>
    <periodNum>1</periodNum>
    ...
  </vdsData>
  <vdsData>
    <contractId>contractId2</contractId>
    <periodNum>-128</periodNum>
 ...
  </vdsData>
</vdsDataSet>

我正在尝试获取所有合同ID和所有相关的期间号码。所以输出应该如下所示:

contractId1
1
contractId2
-128

现在,我只是得到:

contractId1
1

这是我的代码:

    VTDGen vg = new VTDGen();
    vg.parseFile("vdsDataSet.xml",false);
    VTDNav vn = vg.getNav();
    AutoPilot ap = new AutoPilot(vn);
    int result = -1;
    ap.selectXPath("/vdsDataSet/vdsData/contractId");
    while((result = ap.evalXPath())!=-1){
        int t = vn.getText(); // get the index of the text (char data or CDATA)
        String g = null;
        if (t!=-1)
        {
            g = "" + vn.toNormalizedString(t);
            System.out.println(g);
            AutoPilot ap2 = new AutoPilot(vn);
            ap2.selectXPath("/vdsDataSet/vdsData/periodNum[../contractId=\""+g+"\"]");
            int result2= -1;
            while((result2 = ap2.evalXPath())!=-1){
                int t1 = vn.getText(); // get the index of the text (char data or CDATA)
                if (t1!=-1)
                    System.out.println(""+vn.toNormalizedString(t1));

            }

        }   
    }

有谁知道如何解决这个问题,以便显示所有合同ID和相关的期间号码?

如果有人可以帮助我,我们将非常感谢您的帮助。提前谢谢!

编辑:Marcus先要求我通过vdsData添加循环版本。这是我的代码:

    ap.selectXPath("/vdsDataSet/vdsData");
    while((result = ap.evalXPath())!=-1){
AutoPilot ap2 = new AutoPilot(vn);
             ap2.selectXPath("/vdsDataSet/vdsData/contractId");
             int result2= -1;
             while((result2 = ap2.evalXPath())!=-1){
                 int t1 = vn.getText(); // get the index of the text (char data or CDATA)
                 if (t1!=-1)
                  System.out.println(""+vn.toNormalizedString(t1));
         }
             ap2.selectXPath("/vdsDataSet/vdsData/periodNum");
             int result21= -1;
             while((result21 = ap2.evalXPath())!=-1){
                 int t1 = vn.getText(); // get the index of the text (char data or CDATA)
                 if (t1!=-1)
                  System.out.println(""+vn.toNormalizedString(t1));

     }

不幸的是,这仅提供以下内容:

contractId1
contractId2
1
-128

而不是:

 contractId1
 1
 contractId2
 -128

添加了一个稍微修改过的版本的vtd-xml-author的解决方案(让它打印输出并检索periodnum的正确子元素):

    ap.selectXPath("/vdsDataSet/vdsData");
    while((result = ap.evalXPath())!=-1){
        vn.push();
        vn.toElement(VTDNav.FC,"contractId");
        int i=-1;
        i= vn.getText(); //value for contractID here
        System.out.println(vn.toNormalizedString(i)); //added in printlns
        //vn.toElement(VTDNav.P);
        vn.toElement(VTDNav.NS, "periodNum"); //added in "periodNum" after VTDNav.NS
        i=vn.getText(); 
        i= vn.getText(); // value for periodNum here
        System.out.println(vn.toNormalizedString(i));
        vn.pop();
    }

这段代码实际上可行,并且按照我想要的方式执行...假设有一个periodNum元素...但是如果我有多个periodNums怎么办?

1 个答案:

答案 0 :(得分:1)

以下是一种方法。您可以在以后找到其他方法。如果它对您有用,请告诉我。

ap.selectXPath("/vdsDataSet/vdsData");
while((result = ap.evalXPath())!=-1){
    vn.push();
    vn.toElement(VTDNav.FC,"contractID");
    int i=-1;
    i= vn.getText(); //value for contractID here
    //vn.toElement(VTDNav.P);
    vn.toElement(VTDNav.NS);
    i=vn.getText(); 
    i= vn.getText(); // value for periodNum here
    vn.pop();
}