【发布时间】:2011-02-21 18:49:03
【问题描述】:
我正在尝试解析这个巨大的 25GB Plus 维基百科 XML 文件。任何有帮助的解决方案将不胜感激。最好是Java中的解决方案。
【问题讨论】:
-
我认为你需要更具体一点。您是否尝试将其作为 DOM 加载到内存中?您是否尝试提取某些元素或属性?
我正在尝试解析这个巨大的 25GB Plus 维基百科 XML 文件。任何有帮助的解决方案将不胜感激。最好是Java中的解决方案。
【问题讨论】:
当然可以使用 Java 解析巨大的 XML 文件,但您应该使用正确类型的 XML 解析器 - 例如,逐个处理数据元素的 SAX 解析器,而不是尝试加载整个文档的 DOM 解析器进入记忆。
不可能给你一个完整的解决方案,因为你的问题非常笼统和肤浅——你到底想对数据做什么?
【讨论】:
这是一个活动的 java 项目,可用于解析 wikipedia xml 转储文件:
http://code.google.com/p/gwtwiki/。将wikipedia xml内容转换为html、pdf、文本、...的java程序有很多例子:http://code.google.com/p/gwtwiki/wiki/MediaWikiDumpSupport
马西
【讨论】:
是的,没错。不要使用 DOM。如果您只想读取少量数据,并且想存储在自己的 POJO 中,那么您也可以使用 XSLT 转换。
将数据转换为 XML 格式,然后使用 Castor/JAXB(XML 到 ojbect 库)将其转换为一些 POJO。
请分享您是如何解决问题的,以便其他人有更好的方法。
谢谢。
--- 编辑---
查看下面的链接以更好地比较不同的解析器。似乎 STAX 更好,因为它可以控制解析器并在需要时从解析器中提取数据。
http://java.sun.com/webservices/docs/1.6/tutorial/doc/SJSXP2.html
【讨论】:
如果您不打算在该 xml 中编写或更改任何内容,请考虑使用 SAX。它一次在内存中保存一个节点(而不是 DOM,它试图在内存中构建整棵树)。
【讨论】:
我会选择 StAX,因为它提供了比 SAX 更大的灵活性(也是不错的选择)。
【讨论】:
几天前我遇到了这个问题,我发现https://github.com/Stratio/wikipedia-parser 提供的wiki 解析器可以工作。 他们流式传输 xml 文件并以块的形式读取它,然后您可以在回调中捕获这些文件。
这是我在 Scala 中如何使用它的 sn-p:
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,我认为它是您可能需要的管道的一部分。 随便看看代码
【讨论】: