我正在尝试解析这个巨大的25GB Plus维基百科XML文件。任何有用的解决方案都将受到赞赏。最好是Java中的解决方案。
答案 0 :(得分:7)
答案 1 :(得分:4)
当然可以使用Java解析大量的XML文件,但是你应该使用正确的XML解析器 - 例如一个按元素处理数据元素的SAX解析器,而不是一个试图加载整个文档的DOM解析器进入记忆。
不可能给你一个完整的解决方案,因为你的问题非常笼统和肤浅 - 你究竟想对这些数据做些什么?
答案 2 :(得分:3)
这是一个活动的java项目,可用于解析wikipedia xml转储文件:
http://code.google.com/p/gwtwiki/。有很多java程序可以将维基百科xml内容转换为html,pdf,text,......:http://code.google.com/p/gwtwiki/wiki/MediaWikiDumpSupport
马西
答案 3 :(得分:2)
将数据转换为XML格式,然后使用Castor / JAXB(XML到ojbect库)将其转换为某些POJO。
请分享您如何解决问题,以便其他人可以采取更好的方法。
感谢。
--- EDIt ---
检查以下链接,以便更好地比较不同的解析器。似乎STAX更好,因为它可以控制解析器,并在需要时从解析器中提取数据。
http://java.sun.com/webservices/docs/1.6/tutorial/doc/SJSXP2.html
答案 4 :(得分:1)
如果您不打算在该xml中编写或更改任何内容,请考虑使用SAX。它一次在一个节点内存(而不是DOM,它试图在内存中构建整个树)。
答案 5 :(得分:1)
我会选择StAX,因为它提供了比SAX更多的灵活性(也是不错的选择)。
答案 6 :(得分:0)
有一个独立的应用程序可以将Wikipedia转储解析为XML和纯文本,称为Wiki Parser。
原则上,您可以解析Wikipedia转储,然后使用Java通过XML或纯文本执行您需要的任何操作。
这样做的好处是WikiParser非常快,只需2-3个小时就可以解析所有当前的英文维基百科文章。
答案 7 :(得分:0)
前几天我遇到了这个问题,我发现https://github.com/Stratio/wikipedia-parser提供的wiki解析器完成了工作。 它们流式传输xml文件并以块的形式读取,然后您可以在回调中捕获它们。
这是我在Scala中如何使用它的片段:
val parser = new XMLDumpParser(new BZip2CompressorInputStream(new BufferedInputStream(new FileInputStream(pathToWikipediaDump)), true))
parser.getContentHandler.setRevisionCallback(new RevisionCallback {
override def callback(revision: Revision): Unit = {
val page = revision.getPage
val title = page.getTitle
val articleText = revision.getText()
println(articleText)
}
它流式传输维基百科,对其进行解析,每次找到修订版(文章)时,它都会获得其标题,文本并打印文章的文本。 :)
---编辑---
目前我正在研究https://github.com/idio/wiki2vec,我认为这可能是您可能需要的管道的一部分。 随意看看代码