VTD-XML xpath с != больше не работает

Я столкнулся с этой проблемой в течение 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.


person Damiano    schedule 23.05.2017    source источник
comment
Перекрестная проверка: можете ли вы попробовать этот альтернативный XPath /root/temp[not(@attr = 'abcd')]? Кроме того, убедитесь, что ваш XML не содержит пространств имен.   -  person Tomalak    schedule 23.05.2017
comment
@Tomalak мы на самом деле сделали, и это работает (сначала я забыл поставить @ в своем посте, исправлено), но ... я отредактировал свой пост с примером, который показывает, почему мы хотели бы избежать слепого изменения всех xpaths   -  person Damiano    schedule 23.05.2017
comment
Всегда ли [a != b] эквивалентно [not(a = b)] в XPath? Между прочим, можно было бы задать отличный вопрос. Короткий, точно отвечающий, и до сих пор я не думаю, что об этом спрашивали раньше.   -  person Tomalak    schedule 24.05.2017
comment
хорошо, я посмотрю... я помню, кто-то поднимал эту проблему и уже исправил ее в 2.13... посмотрю еще раз   -  person vtd-xml-author    schedule 25.05.2017


Ответы (1)


Я вставил ваш код в свой редактор eclipse, и я получил ответ 2.. не -1, как вы указали...

Итак, что я могу сказать, так это то, что вы не получили последнюю версию, а именно 2.13.1.

Не могли бы вы перейти на веб-сайт vtd-xml и получить версию вместо этого.

https://sourceforge.net/projects/vtd-xml/files/vtd-xml/ximpleware_2.13_2/ximpleware-2.13.2-java.zip/download

Редактировать: пожалуйста, перейдите в репозиторий cvs и загрузите этот файл parser.java... вот куда пошло мое исправление... убедитесь, что он у вас есть...

http://vtd-xml.cvs.sourceforge.net/viewvc/vtd-xml/ximple-dev/com/ximpleware/xpath/parser.java?revision=1.33

Изменить: я опубликовал исправление этой ошибки в версии 2.13_2, и оно вышло сегодня.

person vtd-xml-author    schedule 24.05.2017
comment
Привет, @vtd-xml-author! Я уже использовал версию 2.13_1, но дважды проверил загрузку снова и все еще получаю -1. Я нашел ошибку (я думаю) и заметил, что она все еще присутствует в загружаемой версии. синтаксический анализатор класса, пакет com.ximpleware.xpath, метод CUP$parser$do_action, случай 8 обрабатывает оператор !=, но внутри этого случая всегда используется BinaryExpr.EQ, за исключением последнего else. Я только что заменил BinaryExpr.EQ на BinaryExpr. NE везде в этом случае, и теперь, похоже, он работает. Конечно, мы все еще тестируем, но я почти уверен, что проблема была в этом. Не могли бы вы подтвердить это? - person Damiano; 25.05.2017
comment
Я проверю еще раз и выпущу релиз, чтобы исправить эту ошибку, если смогу это подтвердить... - person vtd-xml-author; 25.05.2017