如何从R中的xml文件解析节点到datatable?

时间:2019-02-12 14:22:00

标签: r xml

这不是我想要的:How to parse XML to R data frame

我不太了解xml,并且有一个xml文件,如下所示:

Userform_Initialize

我想从中解析“ STATISTICS_MEAN”的值,然后将其转换为R中的data.table或data.frame。

我看到了一些例子,但实际上并没有真正为此目的如何做。我想对上面的439个文件执行此操作。[从File1到File439,每个文件都具有相同的属性]因此,如果您帮助我进行循环,我会很受宠若惊。

2 个答案:

答案 0 :(得分:1)

library(data.table)
as.data.table(xmlToDataFrame(xml("file1.xml")))
#                MDI               NA                 NA                NA    NA
#1: 0.43242582678795 0.11312322099674 -0.019055815413594 0.054616362290023 61.25

您可以编写一个简单的包装程序,然后使用lapplyrbindlistsetnames加载所有文件并进行清理。

loadXML <- function(x) as.data.table(xmlToDataFrame(xml(x)))
fls <- rep("test.xml", 10)
datLst <- lapply(fls, loadXML)
dat <- rbindlist(datLst)
setnames(dat, c("maximum", "mean", "minimum", "sd", "vald_perc"))

dat[ , lapply(.SD, type.convert)]
#       maximum      mean     minimum         sd vald_perc
#  1: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25
#  2: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25
#  3: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25
#  4: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25
#  5: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25
#  6: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25
#  7: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25
#  8: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25
#  9: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25
# 10: 0.4324258 0.1131232 -0.01905582 0.05461636     61.25

答案 1 :(得分:1)

请考虑将xmlDataFrame与内部方法xmlAttrsToDataFrame(需要三分冒号运算符)结合使用,以为每个 MDI 节点返回属性值和文本值:

library(XML)

doc <- xmlParse('/path/to/input.xml')

xmldataframe <- cbind(xmlToDataFrame(nodes=getNodeSet(doc, "//MDI")),
                      XML:::xmlAttrsToDataFrame(getNodeSet(doc, "//MDI")))
xmldataframe 
#                 text                      key
# 1   0.43242582678795       STATISTICS_MAXIMUM
# 2   0.11312322099674          STATISTICS_MEAN
# 3 -0.019055815413594       STATISTICS_MINIMUM
# 4  0.054616362290023        STATISTICS_STDDEV
# 5              61.25 STATISTICS_VALID_PERCENT

对于要遍历许多XML文件的循环,请在上面封装一个接收文件路径的函数:

proc_xml <- function(f) {
    doc <- xmlParse(f)

    xmldataframe <- transform(cbind(xmlToDataFrame(nodes=getNodeSet(doc, "//MDI")),
                                    XML:::xmlAttrsToDataFrame(getNodeSet(doc, "//MDI"))), 
                              file = f)                      
    return(xmldataframe)
}

xml_files <- list.files(path="/folder/to/xml/files", pattern=".xml")

df_list <- lapply(xml_files, proc_xml)
final_df <- do.call(rbind, df_list)