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怎么办?
答案 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();
}