VTD не в состоянии оценить "найти все пустые узлы без атрибутов" xpath - PullRequest
0 голосов
/ 26 июня 2019

Я нашел ошибку (я думаю), используя версию 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 «думает», что у узла есть текст, даже пустой, но все же, пока я не ожидаю совпадения. Любой намек?

...