1

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 和相关的期间编号?

如果有人可以帮助我,您的帮助将不胜感激。提前致谢!

编辑:马库斯要求我先添加循环通过 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 有一个元素...但是如果我有多个 periodNum 该怎么办?

4

1 回答 1

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();
}
于 2013-12-11T05:52:43.370 回答