возможно ли использовать Event Sourcing с последовательностями событий StAX XML

У меня проблема с производительностью XML, которую я хочу решить.

В частности, у меня есть один и тот же XML-файл малого/среднего размера, который анализируется много сотен раз.

Функциональность привязана к считывателю событий StAX XML. Его вывод не может быть клонирован или скопирован каким-либо иным образом, единственный способ воспроизвести необходимую функциональность — снова запустить этот модуль чтения событий XML для XML-документа.

Для повышения производительности я хотел бы с нетерпением читать XML в последовательность событий StAX, а затем воспроизводить эту последовательность событий, а не каждый раз повторно анализировать XML.

Я считаю, что проблема заключается в реализации: хотя эта идея в принципе разумна, «события» выражаются в виде изменений состояния по отношению к XMLStreamReader, который имеет большую поверхность API, большая часть (но не вся) которой связана с его «текущим». " мероприятие.

Такая система уже существует?

Если мне придется построить его самостоятельно, что может быть лучшим способом обеспечить правильность?


person Groostav    schedule 08.11.2019    source источник


Ответы (1)


Обычный способ представления XML-документа в памяти, чтобы избежать его повторного анализа, состоит в использовании одной из многих древовидных моделей (JDOM2 и XOM, на мой взгляд, являются лучшими, хотя многие люди до сих пор используют ужасную старую модель DOM просто потому, что она упакованы в JDK). Итак, я думаю, я спрашиваю, почему этот «очевидный» подход не работает для вас?

Бывают случаи, когда (внутри Saxon) я вместо этого использую воспроизводимый поток событий просто потому, что сохранение событий, а затем их воспроизведение немного эффективнее, чем построение дерева, а затем обход дерева. Я не использую для этого события StaX, я использую свой собственный класс net.sf.saxon.event.EventBuffer, который содержит список net.sf.saxon.event.Event объектов. Возможно, эта событийная модель немного лучше разработана для этой цели, поскольку она проще, чем модель StAX. У Saxon нет никакой логики для чтения EventBuffer как потока событий StAX, но это было бы достаточно легко добавить. Это открытый исходный код, так что посмотрите, сможете ли вы его адаптировать.

person Michael Kay    schedule 08.11.2019