java - 是否可以将事件溯源与 StAX XML 事件序列一起使用

标签 java xml event-sourcing stax

我有一个 XML 性能问题需要解决。

具体来说,我有相同的小型/中型 XML 文件,该文件已被解析数百次。

该功能绑定(bind)到 StAX XML 事件读取器。无法克隆或以其他方式复制其输出,重现所需功能的唯一方法是再次在 XML 文档上运行此 XML 事件读取器。

为了提高性能,我希望将 XML 读入 StAX 事件序列,然后重播该事件序列,而不是每次都重新解析 XML。

我认为问题在于实现:虽然这个想法原则上是合理的,但“事件”被表示为针对 XMLStreamReader 的状态更改,XMLStreamReader 具有很大的 API 表面,其中很大一部分(但不是全部)与其“当前”事件相关。

这样的系统已经存在吗?

如果我必须自己构建它,确保正确性的最佳方法是什么?

最佳答案

为了避免重复解析它,在内存中表示 XML 文档的常用方法是使用众多树模型之一(在我看来,JDOM2 和 XOM 是最好的,尽管许多人仍然使用可怕的旧 DOM 模型,只是因为它封装在 JDK 中)。所以我想我在问为什么这种“明显”的方法对你不起作用?

在某些情况下(在 Saxon 内部)我使用可重播的事件流,只是因为存储事件然后重播它们比构建树然后遍历树更有效。我不为此使用 StaX 事件,而是使用我自己的类 net.sf.saxon.event.EventBuffer ,它包含 net.sf.saxon.event.Event 对象的列表。也许这个事件模型的设计更好一些,比 StAX 模型要简单得多。 Saxon 没有任何将 EventBuffer 读取为 StAX 事件流的逻辑,但添加起来很容易。它是开源代码,所以看看您是否可以改编它。

关于java - 是否可以将事件溯源与 StAX XML 事件序列一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58759128/

相关文章:

c# - 使用动态特性读取 XML 结构

events - 事件溯源聚合中的版本号?

java - Axon - 投影还是事件丰富器?

java - 如何识别正则表达式中两个之间没有空格的标记?

xml - 如何删除 XSLT 中的特定子元素?

java - 如何将 Java 变量插入 MySQL 查询?

Android 布局——在一个 ListView 行中垂直堆叠两个 TextView

mongodb - MongoDB 可以成为一致的事件存储吗?

java - 以日期格式而不是字符串获取格式化日期

java - 许可基于 Java Web 的应用程序