java - 是否可以将事件溯源与 StAX XML 事件序列一起使用
问题描述
我有一个要解决的 XML 性能问题。
具体来说,我有相同的中小型 XML 文件,它被解析了数百次。
该功能绑定到 StAX XML 事件阅读器。它的输出不能被克隆或以其他方式复制,重现所需功能的唯一方法是再次在 XML 文档上运行此 XML 事件阅读器。
为了提高性能,我想将 XML 读入 StAX 事件序列,然后重播该事件序列,而不是每次都重新解析 XML。
我认为问题在于实现:虽然这个想法原则上是合理的,但“事件”表示为针对具有较大 API 表面的 XMLStreamReader 的状态更改,其中很大一部分(但不是全部)与其“当前“ 事件。
这样的系统是否已经存在?
如果我必须自己构建它,那么确保正确性的最佳方法是什么?
解决方案
为了避免重复解析它,在内存中表示 XML 文档的常用方法是使用许多树模型中的一种(在我看来,JDOM2 和 XOM 是最好的,尽管很多人仍然使用可怕的旧 DOM 模型,因为它是打包在JDK中)。所以我想我在问为什么这种“显而易见”的方法对你不起作用?
在某些情况下(在 Saxon 内部)我使用可重放的事件流来代替,因为存储事件然后重放它们比构建树然后遍历树更有效。我不为此使用 StaX 事件,我使用我自己的net.sf.saxon.event.EventBuffer
包含对象列表的类net.sf.saxon.event.Event
。也许这个事件模型比 StAX 模型更简单一些。Saxon 没有任何逻辑可以将 anEventBuffer
作为 StAX 事件流读取,但添加起来很容易。它是开源代码,所以看看你是否可以适应它。
推荐阅读
- c# - 网络核心 IOptions
利用 - amazon-ec2 - 无法访问安装在 Amazon Ec2 RHEL 上的端口 8081 上的 nexus3 OSS
- jestjs - 在 Jest 中访问捕获的 stderr 输出
- mysql - SqlDataAdapter#Fill:`SelectCommand.connection` 属性尚未初始化
- python - 如何在 SQLAlchemy 中使用 MySQL SOUNDEX 函数
- api - 对 API 更改感到困惑
- java - Spring WebFlux 块 Http.CONNECT 方法
- javascript - Cordova 未反映 js 文件中的更改
- powershell - 如何通过他们的 InstanceID 选择事件日志
- php - 将 md5 更新为 sha512 授权网