Я использовал VTD-XML для выполнения выражений xpath, но обнаружил, что любое выражение XPath, более сложное, чем использование адреса типа файла (например, // Книги / авторы), не работает и просто возвращает весь файл.
У меня есть два примера: один с использованием метода concat (), другой с использованием метода contains ().
Мой документ test.xml:
<a>
<b>The</b>
<c>fox</c>
<d>
<e>jumps</e>
</d>
</a>
Первый выпуск
У меня проблема при выполнении такой конкатенации:
concat(//b, ' ', //c, ' ', '- Found: ', \"'\", //d/e, \"'\")
Это должно вернуться:
The fox - Found: 'jumps'
но вместо этого возвращает:
Thefoxjumps Thefoxjumps - Found: 'Thefoxjumps'
VTD используется для первого выпуска
File f = new File("C:/Users/../test.xml");
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[(int) f.length()];
fis.read(b);
VTDGen vg = new VTDGen();
vg.setDoc(b);
vg.parse(true);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("concat(//b, ' ', //c, ' ', '- Found: ', \"'\", //d/e, \"'\")");
System.out.println(ap.evalXPathToString());
Второй выпуск
Когда я запускаю такой контейнер:
//a[contains('|jumps|runs|', d/e)]
Это должно вернуть тег «a», так как есть тег «e», содержащий «прыжки». Но вместо этого ничего не возвращает.
Код VTD, использованный для второго выпуска
File f = new File("C:/Users/../test.xml");
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[(int) f.length()];
fis.read(b);
VTDGen vg = new VTDGen();
vg.setDoc(b);
vg.parse(true);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
int r;
while((r = ap.evalXPath()) != -1){
System.out.println("Tag: "+vn.toString(r));
}