VTD XML внутренние выражения XPath - PullRequest
3 голосов
/ 19 ноября 2009

У меня есть XML-файл, например, вот так

<root>
 <test>
  <bla>test1</bla>
 </test>
 <test>
  <bla>test2</bla>
 </test>
 <test>
 </test>
</root>

Теперь я хочу проанализировать его с помощью vtd-xml-parser с помощью выражений XPath. Сначала я ищу теги test по

VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("//test");

Теперь я хочу искать в этих test тегах bla тегов

int result = -1;
int count = 0;

while ((result = ap.evalXPath()) != -1) {
 // evaluate XPath Expressions within the test tags
}

Может кто-нибудь сказать мне, как сделать это выражение? Я не хочу искать во всем документе теги bla, поскольку хочу иметь возможность назначать теги bla тегам test. Я не могу сделать это, например, если теги bla пусты, и я ищу в теге bla весь документ.

Ответы [ 4 ]

3 голосов
/ 20 ноября 2009

Вы можете объявить другой автопилот (показанный ниже), хотя это не всегда самый простой способ

AutoPilot ap2 = new AutoPilot(); ap2.selectXPath("blah");

затем вложите это в цикл

while ((result = ap.evalXPath()) != -1) {
 // evaluate XPath Expressions within the test tags
  int i2=-1;
  while((i2=ap2.evalXPath())!=-1){
     // do more stuff here
  }
}

Но суть в том, что второй xpath должен быть относительным выражением xpath ...

2 голосов
/ 19 ноября 2009

Начальные абзацы, кажется, указывают, что вы хотите это:

//test/bla

Тем не менее, последний абзац, кажется, указывает на то, что вы хотите что-то другое.

1 голос
/ 02 января 2013

Для тех, кто изучает VTD-XML, есть отличная статья о программировании здесь http://www.codeproject.com/Articles/28237/Programming-XPath-with-VTD-XML, написанная самими разработчиками VTD.

Не нашел этой домашней страницы, но это очень помогло при запуске.

1 голос
/ 13 августа 2010

Вот альтернатива использованию 2-х путей. Используйте только один xpath для получения тегов «test», затем используйте цикл для итерации своих дочерних элементов в поисках тегов «bla».

VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("//test");

while (ap.evalXPath() != -1) {
    System.out.println("Inside Test tag");

    //now find the children called "bla"
    if(vn.toElement(VTDNav.FIRST_CHILD, "bla")){
    do{
        int val = vn.getText() ;
        if(val!=-1){
        String value = vn.toNormalizedString(val);
        System.out.println("\tFound bla: " + value);
        }
    }
    while(vn.toElement(VTDNav.NEXT_SIBLING, "bla"));
    }
    //move back to parent
    vn.toElement(VTDNav.PARENT);
}
...