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>
Я пытаюсь получить все идентификаторы контрактов и все связанные с ними номера периодов. Итак, вывод должен выглядеть так:
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));
}
}
}
Кто-нибудь знает, как я могу это исправить, чтобы он отображал ВСЕ идентификаторы контрактов и соответствующие номера периодов?
Если есть кто-нибудь, кто может мне помочь, ваша помощь будет очень признательна. Заранее спасибо!
Редактировать: Маркус попросил меня сначала добавить версию с циклом через 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?
<vsdData>
, используя выражение XPath"vdsDataSet/vdsData"
для своего цикла. В цикле вы выполняете два относительных запроса XPath, используя узел результата вашего итератора цикла в качестве отправной точки и"contractId"
и"periodNum"
в качестве выражений XPath. - person Marcus Rickert   schedule 07.12.2013contractId1 contractId2 1 -128
, когда вы используете относительные пути в цикле по<vsdData>
. Можете ли вы добавить эту версию к своему вопросу, потому что я думаю, что это лучшая отправная точка для решения. - person Marcus Rickert   schedule 08.12.2013