У меня есть ситуация, когда я хочу извлечь некоторую информацию из некоторых очень больших, но обычных файлов XML (просто нужно было сделать это с файлом 500 Мб), и где 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 является реализацией этого. Есть опыт?
РЕДАКТИРОВАТЬ: Я обнаружил, что Saxon 6.5.4 с -Xmx1500m может загружать мой XML, так что это позволило мне использовать мои XPath прямо сейчас. Это просто удачный ход, поэтому я все же хотел бы решить это в общем - это означает возможность написания сценариев, что, в свою очередь, означает, что сначала Java-фильтрация не производится вручную.
РЕДАКТИРОВАТЬ: О, кстати. Это файл журнала, очень похожий на тот, который генерируется log4j XMLLayout. Причина для XML заключается в том, чтобы иметь возможность делать именно это, а именно делать запросы в журнале. Это начальная попытка, отсюда и простой вопрос. Позже я хотел бы иметь возможность задавать более сложные вопросы - поэтому я бы хотел, чтобы язык запросов мог обрабатывать входной файл.