Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中从xml文件解析节点到datatable?_R_Xml - Fatal编程技术网

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

如何在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"

这不是我想要的:

我不太懂xml,有一个xml文件:

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)