Можно ли использовать Event Sourcing с последовательностями событий StAX XML - PullRequest
1 голос
/ 08 ноября 2019

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

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

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

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

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

Система, подобная этой, уже существует?

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

1 Ответ

0 голосов
/ 08 ноября 2019

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

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

...