【问题标题】:issue with making data.frame from xml file从 xml 文件制作 data.frame 的问题
【发布时间】:2015-01-11 18:49:37
【问题描述】:

我第一次尝试将 XML 转换为 R data.frame,并发现了如下问题: How to transform XML data into a data.frame? 非常有帮助,但仍然无法将我的 XML 片段转换为 data.frame。

我的目标是绘制一段时间内欧元兑美元汇率的图表。此处以 XML 格式列出数据:

http://www.ecb.europa.eu/stats/exchange/eurofxref/html/usd.xml

我能够读取数据并显示我感兴趣的数据部分(节点?):

library(XML)
doc <- xmlTreeParse("http://www.ecb.europa.eu/stats/exchange/eurofxref/html/usd.xml")
root <- xmlRoot(doc)
root[[2]][[2]]

我尝试了 getNodeSet() 的变体来显示所有以 开头的行,但到目前为止无济于事:

getNodeSet(root, "/DataSet/Series/*")
getNodeSet(root, "//obs")
getNodeSet(root, "//obs[@OBS_VALUE = 1.1789]")

如何从这个 XML 文件中提取所有变量或变量 TIME_PERIOD 和 OBS_VALUE 并将它们放入 R data.frame 中?已经感谢任何 cmets 或澄清。

【问题讨论】:

  • Tbh,我不知道为什么 xpaths 的子集不起作用(?)。一个深奥的解决方案可能是t(sapply(xmlChildren(xmlRoot(doc)[[2]][[2]]), xmlAttrs))
  • 谢谢@lukeA,这真的很有帮助。

标签: xml r xpath


【解决方案1】:

此数据为 sdmx 格式。可以使用R包rsdmx解析数据:

library(rsdmx)
appData <- readSDMX("http://www.ecb.europa.eu/stats/exchange/eurofxref/html/usd.xml")
myData <- as.data.frame(appData)

> head(myData)
FREQ CURRENCY CURRENCY_DENOM EXR_TYPE EXR_SUFFIX TIME_FORMAT COLLECTION TIME_PERIOD OBS_VALUE OBS_STATUS OBS_CONF
1    D      USD            EUR     SP00          A         P1D          A  1999-01-04    1.1789          A        F
2    D      USD            EUR     SP00          A         P1D          A  1999-01-05    1.1790          A        F
3    D      USD            EUR     SP00          A         P1D          A  1999-01-06    1.1743          A        F
4    D      USD            EUR     SP00          A         P1D          A  1999-01-07    1.1632          A        F
5    D      USD            EUR     SP00          A         P1D          A  1999-01-08    1.1659          A        F
6    D      USD            EUR     SP00          A         P1D          A  1999-01-11    1.1569          A        F

或者,如果您手头只有 XML 包:

doc <- xmlParse("http://www.ecb.europa.eu/stats/exchange/eurofxref/html/usd.xml")
docData <- getNodeSet(doc, "//ns:Obs"
                      , namespaces = c(ns = "http://www.ecb.europa.eu/vocabulary/stats/exr/1")
                      , fun = xmlAttrs)
docData <- do.call(rbind, docData)
> head(docData)
TIME_PERIOD  OBS_VALUE OBS_STATUS OBS_CONF
[1,] "1999-01-04" "1.1789"  "A"        "F"     
[2,] "1999-01-05" "1.1790"  "A"        "F"     
[3,] "1999-01-06" "1.1743"  "A"        "F"     
[4,] "1999-01-07" "1.1632"  "A"        "F"     
[5,] "1999-01-08" "1.1659"  "A"        "F"     
[6,] "1999-01-11" "1.1569"  "A"        "F" 

【讨论】:

  • 哦,天哪,有时像这样我非常喜欢 R ;) 非常感谢@jdharrison!
  • 感谢@jdharrisson 分享这个例子。我还建议查看 rsdmx 项目文档github.com/opensdmx/rsdmx/wiki,其中提供了有关如何使用 rsdmx 的其他示例。希望这会有所帮助
猜你喜欢
  • 2010-11-13
  • 1970-01-01
  • 2011-07-28
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2022-11-20
相关资源
最近更新 更多