R快速XML解析

use*_*943 5 xml r

目前在R中将XML文件转换为数据帧的最快方法是什么?

XML看起来像这样:(注意 - 并非所有行都包含所有字段)

  <row>
    <ID>001</ID>
    <age>50</age>
    <field3>blah</field3>
    <field4 />
  </row>
  <row>
    <ID>001</ID>
    <age>50</age>
    <field4 />
  </row>
Run Code Online (Sandbox Code Playgroud)

我尝试了两种方法:

  1. XML库中的xmlToDataFrame函数
  2. 这里发布面向速度的xmlToDF功能

对于8.5 MB文件,1.6k"行"和114"列",xmlToDataFrame花了25.1秒,而xmlToDF在我的机器上花了16.7秒.

与python XML解析器(例如.xml.etree.ElementTree)相比,这些时间非常大,能够在0.4秒内完成工作.

在R中有没有更快的方法来做到这一点,或者R中是否存在一些阻碍我们加快速度的基础?

对此有所了解真的很有帮助!

Ran*_*Lai 4

已更新评论

d = xmlRoot(doc)
size = xmlSize(d)

names = NULL
for(i in 1:size){
    v = getChildrenStrings(d[[i]])
    names = unique(c(names, names(v)))
}

for(i in 1:size){
    v = getChildrenStrings(d[[i]])
    cat(paste(v[names], collapse=","), "\n", file="a.csv", append=TRUE)
}
Run Code Online (Sandbox Code Playgroud)

对于 1000x100 xml 记录,此过程大约需要 0.4 秒。如果您知道变量名称,甚至可以省略第一个 for 循环。

注意:如果你的xml内容包含逗号、引号,你可能要特别注意它们。在这种情况下,我推荐下一个方法。


如果你想动态构建data.frame,你可以用 来实现data.tabledata.table比上面的csv方法慢一点,但比data.frame

m = data.table(matrix(NA,nc=length(names), nr=size))
setnames(m, names)
for (n in names) mode(m[[n]]) = "character"
for(i in 1:size){
    v = getChildrenStrings(d[[i]])
    m[i, names(v):= as.list(v), with=FALSE]
}
for (n in names) m[, n:= type.convert(m[[n]], as.is=TRUE), with=FALSE]
Run Code Online (Sandbox Code Playgroud)

对于同一文档,大约需要 1.1 秒即可完成。