如何在R中从xml文件解析节点到datatable?
这不是我想要的: 我不太懂xml,有一个xml文件:如何在R中从xml文件解析节点到datatable?,r,xml,R,Xml,这不是我想要的: 我不太懂xml,有一个xml文件: data <- xmlParse("file1.xml") print(data) # $`PAMRasterBand` # <PAMRasterBand band="1"> # <Metadata> # <MDI key="STATISTICS_MAXIMUM">0.43242582678795</MDI> # <MDI key="STATISTICS_MEAN"
data <- xmlParse("file1.xml")
print(data)
# $`PAMRasterBand`
# <PAMRasterBand band="1">
# <Metadata>
# <MDI key="STATISTICS_MAXIMUM">0.43242582678795</MDI>
# <MDI key="STATISTICS_MEAN">0.11312322099674</MDI>
# <MDI key="STATISTICS_MINIMUM">-0.019055815413594</MDI>
# <MDI key="STATISTICS_STDDEV">0.054616362290023</MDI>
# <MDI key="STATISTICS_VALID_PERCENT">61.25</MDI>
# </Metadata>
# </PAMRasterBand>
数据
您可以编写一个简单的包装器,然后使用lappy
、rbindlist
和setnames
加载所有文件并进行清理
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
loadXML
您可以编写一个简单的包装器,然后使用lappy
、rbindlist
和setnames
加载所有文件并进行清理
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
loadXML考虑将xmlDataFrame
与内部方法相结合,xmlatrstodataframe
(需要三重冒号运算符)返回属性值以及每个MDI节点的文本值:
库(XML)
doc考虑将xmlDataFrame
与内部方法相结合,xmlatrstodataframe
(需要三个冒号运算符)返回属性值以及每个MDI节点的文本值:
库(XML)
doc作为旁白,您不应该使用“data”作为变量名,因为它是R中的函数。理想情况下,在我下面给出的示例中,您也不会调用列名函数名(例如mean,sd)。作为旁白,您不应该使用“data”作为变量名,因为它是R中的函数。理想情况下,在我下面给出的示例中,您也不会调用列名函数名(例如mean,sd)。您好,当我运行rbindlist代码时,它将所有变量放入一列中。我如何将它们解析为5列?但您确定属性总是按该顺序排列吗?请注意,XML per中的属性没有顺序规则:开始标记或空元素标记中属性规范的顺序不重要。@BatuhanKavlak如果没有可复制的示例,我无法回答这个问题。由于我们无法播放您的特定文件,这很难。我做了一个小测试,无法重现您的问题。请参见编辑。@Parfait您是对的。如果OP的文件顺序不同,则此操作将不起作用。包装器必须稍微复杂一点,使用xlmToList
并解析出感兴趣的特定字段。实际上,您可以使用内部方法xmlatrstodataframe
检索属性。嗨,当我运行rbindlist代码时,它将所有变量放在一列中。我如何将它们解析为5列?但您确定属性总是按该顺序排列吗?请注意,XML per中的属性没有顺序规则:开始标记或空元素标记中属性规范的顺序不重要。@BatuhanKavlak如果没有可复制的示例,我无法回答这个问题。由于我们无法播放您的特定文件,这很难。我做了一个小测试,无法重现您的问题。请参见编辑。@Parfait您是对的。如果OP的文件顺序不同,则此操作将不起作用。包装器必须稍微复杂一点,使用xlmToList
并解析出感兴趣的特定字段。实际上,您可以使用内部方法xmlatrstodataframe
检索属性。这正是我要找的!荣誉这正是我要找的!荣誉
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
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)