使用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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |