首页 > 解决方案 > 是否可以将事件溯源与 StAX XML 事件序列一起使用

问题描述

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

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

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

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

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

这样的系统是否已经存在?

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

标签: javaxmlevent-sourcingstax

解决方案


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

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


推荐阅读