我有一个 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/