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

前端之家收集整理的这篇文章主要介绍了使用XSLT进行XML提取而不必将整个DOM树读入内存?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一种情况,我想从一些非常大但常规的 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

猜你在找的XML相关文章