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 该怎么办?