在 R 中以块的形式读取和解析 xml

read and parse a xml in chunks in R

我正在尝试使用 R 从维基百科转储中读取和处理 ~5.8GB .xml。我没有那么多 RAM,所以我想分块处理它。 (目前使用 xml2::read_xml 完全阻塞我的电脑)

该文件包含每个维基百科页面的一个 xml 元素,如下所示:

<page>
    <title>AccessibleComputing</title>
    <ns>0</ns>
    <id>10</id>
    <redirect title="Computer accessibility" />
    <revision>
      <id>631144794</id>
      <parentid>381202555</parentid>
      <timestamp>2014-10-26T04:50:23Z</timestamp>
      <contributor>
        <username>Paine Ellsworth</username>
        <id>9092818</id>
      </contributor>
      <comment>add [[WP:RCAT|rcat]]s</comment>
      <model>wikitext</model>
      <format>text/x-wiki</format>
      <text xml:space="preserve">#REDIRECT [[Computer accessibility]]

{{Redr|move|from CamelCase|up}}</text>
      <sha1>4ro7vvppa5kmm0o1egfjztzcwd0vabw</sha1>
    </revision>
</page>

可以找到文件示例here

从我的角度来看,我认为可以分块读取它,就像文件中的一页一页一样。 Ans 将每个处理过的 page 元素作为一行保存在 .csv 文件中。

我想要一个包含以下列的 data.frame。

id、标题和文本。

如何分块阅读此 .xml

可以改进,但主要思想在这里。您仍然需要定义最佳方式来定义您要在 readLines() 函数内的每个交互中读取的行数,以及读取每个块的方法,但是获取块的解决方案在这里:

xml <- readLines("ptwiki-20161101-pages-articles.xml", n = 2000)

inicio <- grep(pattern = "<page>", x = xml)
fim <- grep(pattern = "</page>", x = xml)
if (length(inicio) > length(fim)) { # if you get more beginnings then ends
  inicio <- inicio[-length(inicio)] # drop the last one
}

chunks <- vector("list", length(inicio))

for (i in seq_along(chunks)) {
  chunks[[i]] <- xml[inicio[i]:fim[i]]
}

chunks <- sapply(chunks, paste, collapse = " ")

我试过 read_xml(chunks[1]) %>% xml_nodes("text") %>% xml_text() 并且成功了。