将endnote XML转换为R数据帧

时间:2017-04-19 11:11:00

标签: r xml

我希望将Endnote的xml输出转换为R数据帧,每个子节点都是一个单独的列。

先前已经问过类似的问题here,但答案并没有解决多个作者,关键词等的记录问题(虽然注意到了问题)。

我想知道如何为贡献者,期刊,关键字等字段添加分隔符(例如;),这些字段通常会返回多个值。

示例数据如下。可以看出,上面提到的字段的条目有多个条目没有分隔符。

library(XML)
library(RCurl)

urldata<-"https://gist.githubusercontent.com/nickbond/4f5a600836bf43a60d99e2a63e5a62de/raw/2088f8065eebbfe9e57c761ffa801b0a18588498/endnote.xml"
endnotexml<-xmlParse(getURL(urldata))
xmlToDataFrame(getNodeSet(endnotexml,'//*/record'))

我尝试了一系列方法 - 包括尝试首先转换为列表,并通过for循环迭代条目。对于我拥有的案件数量来说,后者太慢了。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

XML有太多级别让xmlToDataFrame运行良好,所以我会创建一个将多个标签组合成一个分隔列表的函数(并为缺少的节点添加NA)

x <-  getNodeSet(endnotexml,'//record')

xpath2 <-function(x, ...){
    y <- xpathSApply(x, ...)
    y <- gsub(",", "", y)  # remove commas if using comma separator
    ifelse(length(y) == 0, NA,  paste(y, collapse=", "))
}

使用前导.,以便xpath相对于该节点并获取所需的列。注意xmlGetAttr也可以。

res <- data.frame(
  authors = sapply(x, xpath2, ".//author", xmlValue),
   year   = sapply(x, xpath2, ".//dates/year", xmlValue),
  journal = sapply(x, xpath2, ".//periodical/full-title", xmlValue),
 ref_type = sapply(x, xpath2, ".//ref-type", xmlGetAttr, "name")
 )

 res
                                       authors year                journal        ref_type
 1                     Abbott I., Le Maitre D. 2010        Austral Ecology Journal Article
 2           Abbott S., Chadwick D., Street G. 2007 Exploration Geophysics Journal Article
 3 Abdel-Fattah Z. A., Kora M. A., Ayyad S. N. 2013                 Facies Journal article