Заполните POJO из XML, используя VTD-XML - PullRequest
0 голосов
/ 18 сентября 2018

Пример XML

<?xml version="1.0" encoding="UTF-8"?>
<Document>
    <Report>
        <Node>
            <Detail>
                <Id>1</Id>
                <Value>Value 1</Value>
                <Tag1>
                    <Owner>
                        <Id>
                            <INT>12345</INT>
                        </Id>
                    </Owner>
                </Tag1>
            </Detail>
            <Status>
                <Result>Pass</Result>
            </Status>
        </Node>
        <Node>
            <Detail>
                <Id>2</Id>
                <Value>Value 2</Value>
                <Tag1>
                    <Owner>
                        <Id>
                            <String>TEST</String>
                        </Id>
                    </Owner>
                </Tag1>
            </Detail>
            <Status>
                <Result>Fail</Result>
            </Status>
        </Node> 
        <Node>
            <Detail>
                <Id>3</Id>
                <Value>Value 3</Value>
                <Tag1>
                    <Owner>
                        <Id>
                            <UN>UNKNOWN</UN>
                        </Id>
                    </Owner>
                </Tag1>
            </Detail>
            <Status>
                <Result>Waiting</Result>
            </Status>
        </Node>
    </Report>
</Document>

Основываясь на приведенной выше структуре, я хочу прочитать элементы / атрибуты и заполнить POJO (предпочтительно XPath), поскольку путь к элементу не согласован, например: <Tag1>.

Я не могу понять, как поступить.Я пытался использовать AutoPilot, но он считывает данные последовательно, например, все идентификаторы узлов.Я не могу найти способ прочитать все данные в <Node>, а затем перейти к следующему и так далее.В конце мне нужно вернуть заполненную коллекцию POJO.

DOM выходит из области видимости, поскольку XML-файл огромен, размером от 800 МБ до 1 ГБ с прим.600 000+ <Node>.

Заранее спасибо.

XML Reader

открытый процесс void (окончательный String fullPath) {

try {
    final VTDGen vg = new VTDGen();

    if (vg.parseFile(fullPath, false)) {
        final VTDNav vn = vg.getNav();
        final AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath(ROOT);

        while ((ap.evalXPath()) != -1) {
            final AutoPilot pilot1 = new AutoPilot(vn);
            pilot1.selectXPath(ROOT + "/Detail/Id");

            while (pilot1.evalXPath() != -1) {
                final int t = vn.getText();
                if (t != -1) {
                    System.out.println(vn.toNormalizedString(t));
                }

                final AutoPilot pilot2 = new AutoPilot(vn);
                pilot2.selectXPath(ROOT + "/Status/Result");

                if (pilot2.evalXPath() != -1) {
                    final int k = vn.getText();
                    if (k != -1) {
                        System.out.println(vn.toNormalizedString(k));
                    }
                }
                // pilot2.resetXPath();
            }
        }
    }
}
catch (Exception exception) {
}

}

1 Ответ

0 голосов
/ 20 сентября 2018

Я немного изменил ваш код, чтобы он работал ... плюс исправил несколько вещей ... вернусь с дополнительными комментариями, встроенными в код ....

Несколько вещей, которые нужно сохранить вmind

  1. никогда не помещайте экземпляр autoPIlot и выбор xpath в цикл while.Никогда!
  2. Повторное использование с помощью resetXPath ()
  3. Используйте push и pop для поддержания согласованного состояния во внешнем цикле while.

import com.ximpleware. *;общественный класс sawi {

public static void main(String[] args) throws Exception{
    // TODO Auto-generated method stub
    final VTDGen vg = new VTDGen();

    if (vg.parseFile("d:\\xml\\sawi.xml", false)) {
        final VTDNav vn = vg.getNav();
        final AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/Document/Report/Node");
        final AutoPilot pilot1 = new AutoPilot(vn);
        pilot1.selectXPath("Detail/Id");
        final AutoPilot pilot2 = new AutoPilot(vn);
        pilot2.selectXPath("Status/Result");
        while ((ap.evalXPath()) != -1) {
            vn.push();
            while (pilot1.evalXPath() != -1) {
                final int t = vn.getText();
                if (t != -1) {
                    System.out.println(vn.toNormalizedString(t));
                }

            } 
            vn.pop();
            vn.push();
                if (pilot2.evalXPath() != -1) {
                    final int k = vn.getText();
                    if (k != -1) {
                        System.out.println(vn.toNormalizedString(k));
                    }
                }
            vn.pop();
            pilot2.resetXPath();
            pilot1.resetXPath();

           // vn.pop();
        }
    }
}

}

...