我有一个要解决的XML性能问题。
特别是我得到了相同的中小型XML文件,该文件已被解析了数百次。
该功能已绑定到StAX XML事件阅读器。无法克隆或复制其输出,重现所需功能的唯一方法是再次在XML文档上运行此XML事件读取器。
为了提高性能,我想将XML急切地读入StAX事件序列中,然后重播该事件序列,而不是每次都重新解析XML。
我相信问题在于实现:尽管这种想法在原则上是合理的,但“事件”表示为针对具有大型API界面的XMLStreamReader的状态更改,XMLStreamReader的大部分(但并非全部)与其“当前事件。
这样的系统已经存在吗?
如果我必须自己构建它,那么确保正确性的最佳方法是什么?
在内存中表示XML文档的通常方法是避免使用重复的语法,这是使用许多树模型之一(我认为JDOM2和XOM是最好的,尽管许多人仍然只是简单地使用旧的DOM模型)因为它包装在JDK中)。所以我想我想问为什么这种“显而易见的”方法对您不起作用?
[在某些情况下,(在Saxon内部)我改为使用可重播的事件流,这仅仅是因为存储事件然后重播它们比构建一棵树然后走一棵树效率更高。我不为此使用StaX事件,而是使用自己的类net.sf.saxon.event.EventBuffer
,该类包含net.sf.saxon.event.Event
对象的列表。也许此事件模型为此目的进行了更好的设计,比StAX模型要简单得多。 Saxon没有任何逻辑将StA事件流读取为EventBuffer
,但是添加起来很容易。它是开放源代码,因此请查看是否可以适应它。