加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用XSLT进行XML提取而不必将整个DOM树读入内存?

发布时间:2020-12-16 23:21:15 所属栏目:百科 来源:网络整理
导读:我有一种情况,我想从一些非常大但常规的 XML文件中提取一些信息(只需要使用500 Mb文件),并且XSLT将是完美的. 不幸的是,我所知道的那些XSLT实现(除了最昂贵的Saxon版本之外)不支持只读取DOM的必要部分,而是读取整个树.这导致计算机交换死亡. 有问题的XPath是
我有一种情况,我想从一些非常大但常规的 XML文件中提取一些信息(只需要使用500 Mb文件),并且XSLT将是完美的.

不幸的是,我所知道的那些XSLT实现(除了最昂贵的Saxon版本之外)不支持只读取DOM的必要部分,而是读取整个树.这导致计算机交换死亡.

有问题的XPath是

//m/e[contains(.,'foobar')

所以它基本上只是一个grep.

是否有可以执行此操作的XSLT实现?或者给出合适的“建议”的XSLT实现可以修复内存中不再需要的部分吗?

我更喜欢Java实现,但Windows和Linux都是可行的本机平台.

编辑:输入XML看起来像:

<log>
<!-- Fri Jun 26 12:09:27 CEST 2009 -->
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Registering Catalina:type=Manager,path=/axsWHSweb-20090626,host=localhost</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Force random number initialization starting</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Getting message digest component for algorithm MD5</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Completed getting message digest component</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>getDigest() 0</m></e>
......
</log>

Essentialy我想选择一些m节点(我知道XPath是错误的,它只是一个快速的黑客),但保持XML布局.

编辑:似乎STX可能是我正在寻找的(我可以使用另一种转换语言),并且Joost是一个实现.任何经历?

编辑:我发现带有-Xmx1500m的Saxon 6.5.4可以加载我的XML,所以这让我现在可以使用我的XPath.这只是一个幸运的中风所以我仍然想要一般性地解决这个问题 – 这意味着可编写脚本,这反过来意味着首先没有手工制作的Java过滤.

编辑:哦,顺便说一下.这是一个非常类似于log4j XMLLayout生成的日志文件. XML的原因是能够做到这一点,即对日志进行查询.这是最初的尝试,因此是一个简单的问题.后来我希望能够提出更复杂的问题 – 因此我希望查询语言能够处理输入文件.

解决方法

考虑 VTD-XML.它的内存效率更高.您可以找到API here和基准 here.

alt text http://www.ximpleware.com/2.3/benchm4.gif

请注意,最后一个图表说DOM使用的内存至少是XML文件的5倍.毕竟真的很惊人,不是吗?

作为奖励,它在解析和Xpath方面也比DOM和JDK更快:

alt text http://www.ximpleware.com/2.3/benchm3.gif

alt text http://vtd-xml.sourceforge.net/2.3/benchm27.gif

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读