已更新评论
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)
}
对于 1000x100 xml 记录,此过程大约需要 0.4 秒。如果您知道变量名称,甚至可以省略第一个 for 循环。
注意:如果你的xml内容包含逗号、引号,你可能要特别注意它们。在这种情况下,我推荐下一个方法。
如果你想动态构建 data.frame ,你可以这样做data.table
, data.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]
对于同一文档,大约需要 1.1 秒即可完成。