我有一种情况,我想从一些非常大但常规的 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>
本质上,我想选择一些 m 节点(我知道 XPath 是错误的,这只是一个快速破解),但要保持 XML 布局。
编辑:看来 STX 可能是我正在寻找的(我可以使用另一种转换语言),并且 Joost 是其中的一种实现。有什么经验吗?
编辑:我发现带有 -Xmx1500m 的 Saxon 6.5.4 可以加载我的 XML,所以这让我现在可以使用我的 XPath。这只是一个幸运的中风,所以我仍然想一般地解决这个问题 - 这意味着可编写脚本,这反过来意味着首先没有手工制作的 Java 过滤。
编辑:哦,顺便说一句。这是一个非常类似于 log4j XMLLayout 生成的日志文件。XML 的原因是能够做到这一点,即对日志进行查询。这是最初的尝试,因此是一个简单的问题。稍后我希望能够提出更复杂的问题 - 因此我希望查询语言能够处理输入文件。