【问题标题】:Is there a solution to parse wikipedia xml dump file in Java?有没有用Java解析wikipedia xml转储文件的解决方案?
【发布时间】:2011-02-21 18:49:03
【问题描述】:

我正在尝试解析这个巨大的 25GB Plus 维基百科 XML 文件。任何有帮助的解决方案将不胜感激。最好是Java中的解决方案。

【问题讨论】:

  • 我认为你需要更具体一点。您是否尝试将其作为 DOM 加载到内存中?您是否尝试提取某些元素或属性?

标签: java xml parsing


【解决方案1】:

用于解析 Wikipedia XML 转储的 Java API:WikiXMLJ(上次更新时间为 2010 年 11 月)。
此外,还有一个活着的mirror,它与一些错误修复兼容。

【讨论】:

  • 这个项目似乎在 2010 年末左右就死了。有谁知道它是否搬到了其他地方?
【解决方案2】:

当然可以使用 Java 解析巨大的 XML 文件,但您应该使用正确类型的 XML 解析器 - 例如,逐个处理数据元素的 SAX 解析器,而不是尝试加载整个文档的 DOM 解析器进入记忆。

不可能给你一个完整的解决方案,因为你的问题非常笼统和肤浅——你到底想对数据做什么?

【讨论】:

    【解决方案3】:

    这是一个活动的 java 项目,可用于解析 wikipedia xml 转储文件:
    http://code.google.com/p/gwtwiki/。将wikipedia xml内容转换为html、pdf、文本、...的java程序有很多例子:http://code.google.com/p/gwtwiki/wiki/MediaWikiDumpSupport

    马西

    【讨论】:

      【解决方案4】:

      是的,没错。不要使用 DOM。如果您只想读取少量数据,并且想存储在自己的 POJO 中,那么您也可以使用 XSLT 转换。

      将数据转换为 XML 格式,然后使用 Castor/JAXB(XML 到 ojbect 库)将其转换为一些 POJO。

      请分享您是如何解决问题的,以便其他人有更好的方法。

      谢谢。

      --- 编辑---

      查看下面的链接以更好地比较不同的解析器。似乎 STAX 更好,因为它可以控制解析器并在需要时从解析器中提取数据。

      http://java.sun.com/webservices/docs/1.6/tutorial/doc/SJSXP2.html

      http://tutorials.jenkov.com/java-xml/sax-vs-stax.html

      【讨论】:

        【解决方案5】:

        如果您不打算在该 xml 中编写或更改任何内容,请考虑使用 SAX。它一次在内存中保存一个节点(而不是 DOM,它试图在内存中构建整棵树)。

        【讨论】:

          【解决方案6】:

          我会选择 StAX,因为它提供了比 SAX 更大的灵活性(也是不错的选择)。

          【讨论】:

            【解决方案7】:

            几天前我遇到了这个问题,我发现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,我认为它是您可能需要的管道的一部分。 随便看看代码

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-11-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-16
              • 1970-01-01
              • 2011-09-07
              相关资源
              最近更新 更多