Я нашел ошибку (я думаю), используя версию vtd-xml 2.13.4. Короче, у меня есть следующий фрагмент кода:
String test = "<catalog><description></description></catalog>";
VTDGen vg = new VTDGen();
vg.setDoc(test.getBytes("UTF-8"));
vg.parse(true);
VTDNav vn = vg.getNav();
//get nodes with no childs, text and attributes
String xpath = "/catalog//*[not(child::node()) and not(child::text()) and count(@*)=0]";
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath(xpath);
//block inside while is never executed
while(ap.evalXPath()!=-1) {
System.out.println("current node "+vn.toRawString(vn.getCurrentIndex()));
}
и это не работает (= не найти ни одного узла, в то время как вместо него должно быть найдено «описание»). Приведенный выше код работает, если я использую самозакрывающийся тег:
String test = "<catalog><description/></catalog>";
Дело в том, что каждый оценщик xpath работает с обеими версиями xml. К сожалению, я получаю XML из внешнего источника, поэтому у меня нет власти над ним ...
Преодолев xpath, я заметил, что при оценке обоих
/catalog//*[not(child::node())]
и
/catalog//*[not(child::text())]
дать ложь в качестве результата. В качестве дополнительного бита я попробовал что-то вроде:
String xpath = "/catalog/description/text()";
ap.selectXpath(xpath);
if(ap.evalXPath()!=-1)
System.out.println(vn.toRawString(vn.getCurrentIndex()));
И это печатает пустое пространство, так что в некотором смысле VTD «думает», что у узла есть текст, даже пустой, но все же, пока я не ожидаю совпадения. Любой намек?