在Groovy中解析WikipediaXML转储

在Groovy中解析WikipediaXML转储,xml,groovy,Xml,Groovy,最近我想研究维基百科的数据。在这种情况下,我下载了它的en-lang XML转储文件。 超过44GB。我想我会用XmlSlurper来解析它,根据文档,它足以解析大型XML文件。不幸的是,我遇到了一些“内存不足异常”。Groovy中是否有任何方法(使用现有的libs)来解析那个“怪物文件”XmlSlurper确实在幕后使用SAX解析器,但它将数据加载到内部模型中,因此不适合解析真正的大文件 我相信您需要使用一个或其他(xslt?)工具,这取决于您的用例您需要找到一个能够以流式方式处理XML的工具

最近我想研究维基百科的数据。在这种情况下,我下载了它的en-lang XML转储文件。
超过44GB。我想我会用XmlSlurper来解析它,根据文档,它足以解析大型XML文件。不幸的是,我遇到了一些“内存不足异常”。Groovy中是否有任何方法(使用现有的libs)来解析那个“怪物文件”

XmlSlurper
确实在幕后使用SAX解析器,但它将数据加载到内部模型中,因此不适合解析真正的大文件


我相信您需要使用一个或其他(xslt?)工具,这取决于您的用例

您需要找到一个能够以流式方式处理XML的工具,而不是预先将整个内容加载到内存中的树模型中。您可以使用SAX(您将代码编写为事件处理程序方法,然后解析器在遍历文档时调用这些方法)或StAX(您可以从解析器“拉”事件,而不是让解析器“推”它们),但另一种选择是使用类似的模型,该模型可以在一种“半流”模式下运行,一次只为转储的一个
提供树模型:

导入nu.xom*
类PageHandler扩展了NodeFactory{
私有节点为空=新节点()
闭包处理程序
公共节点finishMakingElement(元素e){
如果(e.localName=='page'){
handler.call(e)
返回空
}否则{
返回super.finishMakingElement(e)
}
}
}
//称之为
新建生成器(新建页面处理程序(处理程序:{page->
def latestRevText=
page.getFirstChildElement('revision').getFirstChildElement('text').value
// ...
})).build(文件或输入流或读卡器)
您可以对其他一些库执行类似的操作,例如