VTD-XML: проверка только закрывающего тега не работает - PullRequest
0 голосов
/ 25 июня 2018

Я использую анализатор VTD-XML для получения значения из XML с указанным путем. Ниже мой код Java.

VTDGen vg = new VTDGen();
vg.setDoc(xml.getBytes());
vg.parse(true);
VTDNav vn = vtdGen.getNav();
AutoPilot ap = new AutoPilot(vn);
xpath="ROOT/STUDENT[(not(DATE) or DATE='')]/NAME";
ap.selectXPath(xpath);

while(ap.evalXPath() != -1) {
        long l = vn.getContentFragment();
        value= vn.toString((int )l, (int)(l>>32));
}

А мой xml выглядит так.

<ROOT>
<STUDENT>
    <NAME>John</NAME>
    <DATE>12-JUNE-18</DATE>
</STUDENT>
<STUDENT>
    <NAME>Peter</NAME>
    <DATE/>
</STUDENT>
</ROOT>

Я хотел выбрать имя Питера, используя XPATH. Этот xpath работает в преобразовании xsl, но не работает в VTD-XML.

Что-то не так с моим анализом или XPATH?

1 Ответ

0 голосов
/ 27 июня 2018

Когда вы закончите анализ xml с VTD-XML, позиция курсора по умолчанию для VTDNav находится на узле корневого элемента.В вашем случае это на узле ROOT.Поэтому, когда вы запускаете xpath «ROOT / STUDENT [(not (DATE) или DATE = '')] / NAME», вы фактически запрашиваете узел / ROOT / ROOT / STUDENT / NAME.

Самое простое исправление - изменить XPath на STUDENT [(not (DATE) или DATE = '')] / NAME, который является относительным xpath.

Или вы можете использовать абсолютный xpath/ ROOT / STUDENT [(not (DATE) или DATE = '')] / NAME.

Или вы можете сначала вызвать метод toElement () VTDNav и присвоить ему параметр "PARENT", чтобы переместить курсор наузел документа ... он тоже будет работать

После нескольких испытаний с моей стороны я обнаружил, что это ошибка в методе внутри класса VTDNav с именем

XPathStringVal_Matches (int j, String s);

Вам будет удобно вырезать / вставить какой-нибудь код для исправления ошибки?

Я предоставлю вам инструкцию, которую очень легко исправить ...

...