Я столкнулся с этой проблемой в течение 2 дней, так как мы обновили библиотеку. У нас есть много xpath такого рода:
/root/temp[@attr!='abcd']
и они больше не работают, так как мы обновили библиотеку до версии 2.13. Они отлично работали с версией 2.11, но больше не работают с версиями >=2.12. Проблему легко воспроизвести:
String test = "<root><attr temp='abcde'></attr></root>";
VTDGen vg = new VTDGen();
vg.setDoc(test.getBytes());
vg.parse(false);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/root/attr[@temp!='abcd']");
System.out.println(ap.evalXPath());//expecting a positive int, get -1 instead
Мы обновились из-за другой ошибки, но теперь мы действительно застряли с этой. Есть идеи? Есть ли другой синтаксис, который мы можем использовать для обхода этой ошибки? Мы пробовали с /root/attr[not(@temp='abcd')]
, и он работает с этим простым случаем, но мы не уверены, что это действительно для каждого xpath, который включает оператор "!=" as.
Обратите внимание, что 2.11 работал даже с xpath, например /root/attr[@temp!='']
, после этой версии кажется, что оператор !=
не работает, по крайней мере, для того использования, к которому мы привыкли.
EDIT: Причина, по которой мы не будем использовать синтаксис «не», заключается в том, что в таком случае
<root>
<nodes>
<node attr="1" />
<node attr="2" />
<node attr="3" />
</nodes>
<nodi>
<nodo attr="1" />
<nodo attr="2" />
<nodo attr="3" />
</nodi>
</root>
Эти пути:
/root/nodes/node[@attr!=/root/nodi/nodo/@attr]
/root/nodes/node[not(@attr=/root/nodi/nodo/@attr)]
возвращать разные результаты. Я знаю, что это довольно тривиальный пример, просто мы не можем быть уверены, что все будет работать как положено, просто найдя и заменив. Я только что погрузился в исходный код и заметил, что синтаксический анализатор просто вырезал ! из выражения xpath.
/root/temp[not(@attr = 'abcd')]
? Кроме того, убедитесь, что ваш XML не содержит пространств имен. - person Tomalak   schedule 23.05.2017