2015-03-12 3 views
1

У меня есть XML, который выглядит ниже. Я хочу пройти всю серию братьев, используя один общий автопилот. После selectXPath on/a/b, который подводит меня к первому b sibling, я пытаюсь использовать тот же AutoPilot для выбораXPath на c, который вернет всех c братьев. Тем не менее, после цикла пересечения c, я не знаю, как вернуть контекст цикла b. Цель, предназначенная для использования одного общего AutoPilot, - повысить производительность. Есть предположения?Использование 1 AutoPilot, проходящей рядом братьев и сестер внутри серии братьев и сестер?

<a> 
    <b> 
     <c>c1</c> 
     <d>d1.1</d> 
     <d>d1.2</d> 
     <d>d1.3</d> 
     <d>d1.4</d> 
     <d>d1.5</d> 
     <d>d1.6</d> 
     <e>e1</e> 
    </b> 
    <b> 
     <c>c2</c> 
     <d>d2.1</d> 
     <d>d2.2</d> 
     <d>d2.3</d> 
     <e>e2</e> 
    </b> 
</a> 

Имея вышеизложенный XML, моя мотивация заключается в том, чтобы получить значения, пройдя иерархию XML. Требование фактически состоит в том, чтобы создать представление иерархической структуры Java. Чтобы добиться этого, я делаю рекурсивный подход, используя алгоритм глубины. Ниже только для того, чтобы продемонстрировать мое намерение, я просто петли. Как заметил, во внутреннем цикле я вынужден создать новый AutoPilot внутри цикла, чтобы поддерживать другой контекст, проходящий через/a/b. Теперь я хотел бы знать, как я могу получить один AutoPilot. Я пробовал его vtd.push и vtd.pop. Это не работает.

VTDGen vtdGen = new VTDGen(); 
vtdGen.setDoc(this.xml.getBytes()); 
vtdGen.parse(false); 
VTDNav vtdNav = vtdGen.getNav(); 

AutoPilot autoPilot1 = new AutoPilot(vtdNav); 
autoPilot1.selectXPath("https://stackoverflow.com/a/b"); 
while (autoPilot1.evalXPath() != -1) 
{ 
    AutoPilot autoPilot2 = new AutoPilot(vtdNav); 
    autoPilot2.selectXPath("c"); 
    System.out.println(autoPilot2.evalXPathToString()); 
    autoPilot2.selectXPath("d"); 
    while (autoPilot2.evalXPath() != -1) 
    { 
     System.out.println(vtdNav.toNormalizedXPathString(vtdNav.getCurrentIndex())); 
    } 
    autoPilot2.selectXPath("e"); 
    System.out.println(autoPilot2.evalXPathToString()); 
} 

Заранее благодарен.

+0

Можете ли вы разместить свой код? –

+0

Вам нужно взять «c» и «d» из петли –

ответ

0

Мое исправление вашего кода. дайте мне знать, если возникнут какие-либо вопросы. Обратите внимание, что AutoPilot не кэширует выражения xpath. Один xpath соответствует одному объекту AutoPilot.

VTDGen vtdGen = new VTDGen(); 
vtdGen.setDoc(this.xml.getBytes()); 
vtdGen.parse(false); 
VTDNav vtdNav = vtdGen.getNav(); 
AutoPilot autoPilot2 = new AutoPilot(vtdNav); 
autoPilot2.selectXPath("c"); 
AutoPilot autoPilot3 = new AutoPilot(vtdNav); 
autoPilot3.selectXPath("e"); 
AutoPilot autoPilot4 = new AutoPilot(vtdNav); 
autoPilot4.selectXPath("d"); 
System.out.println(autoPilot2.evalXPathToString()); 
autoPilot1.selectXPath("https://stackoverflow.com/a/b"); 
while (autoPilot1.evalXPath() != -1) 
{ 

    System.out.println(autoPilot2.evalXPathToString()); 
    vtdNav.push(); 
    while (autoPilot2.evalXPath() != -1) 
     {  System.out.println(vtdNav.toNormalizedXPathString(vtdNav.getCurrentIndex())); 
    } 
    vtdNav.pop(); 
    System.out.println(autoPilot3.evalXPathToString()); 
    System.out.println(autoPilot4.evalXPathToString()); 
} 
+0

Привет, есть ли способ использовать один автопилот? Таким образом, я могу улучшить производительность, кэшируя xpath. – sincang

+0

, используя один автопилот, не улучшает производительность, вы должны/можете создавать экземпляры как много автопилотов, если обоснования не выполняются повторно, нет потерь производительности ... –

+0

Подчинение должно быть экземпляром .. для справки –