无法使用XML2Obs(XML2R包)从OECD读取数据

时间:2015-07-16 14:33:40

标签: xml r

我有一个SDMX查询 大约一个月前工作正常,但现在突然间它出现了错误:

  

rapply错误(docs,function(x)getNodeSet(x,path = xpath),classes = c(“XMLInternalDocument”,:     'object'必须是一个列表

我尝试使用浏览器加载页面,它似乎返回XML数据,虽然我不太了解XML以找出可能出错的地方。这是代码:

library(XML2R)

sdmx <- paste0("http://stats.oecd.org/restsdmx/sdmx.ashx/GetData/FDI_FLOW_AGGR/",
           "AUS+AUT+BEL+CAN+CHL+CZE+DNK+EST+FIN+FRA+DEU+GRC+HUN+ISL+IRL+ISR",
           "+ITA+JPN+KOR+LUX+MEX+NLD+NZL+NOR+POL+PRT+SVK+SVN+ESP+SWE+CHE+TU",
           "R+GBR+USA+G20_OECD+G20_NON_OECD+EU+G20+OECD+WLD+NMEC+ARG+BRA+CH",
           "N+IND+IDN+RUS+SAU+ZAF.USD+SUB.A+DI+DO.T_FA_F.ALL+ROU.NET+A+L.D/",
           "all?startTime=2005&endTime=2015-Q4")

xmlobs <- XML2Obs(sdmx, quiet=TRUE)
tables <- collapse_obs(xmlobs)

它打破了XML2Obs,所以我猜不需要最后一行,但无论如何你都明白了。

知道可能会发生什么吗?或者我如何轻松切换到不同的XML阅读器?我担心的是将XML2R中的混乱转换为可用的数据框并不容易,所以如果我切换到不同的XML解析器,它进入R时可能会形成一个非常不同的形状。

谢谢!

2 个答案:

答案 0 :(得分:1)

XML2R面临的问题似乎是因为数据未在R中正确地作为XML对象获取。我查看了XML2R,调试了上述请求。

最近,OECD.Stats对SDMX API进行了更改,在SDMX响应中引入了字节顺序标记(BOM):似乎BOM不是由XML2R使用的依赖关系管理的,至少它似乎是OECD请求失败的原因:原因依赖似乎是curl包,XML2R通过httrGET方法使用。

GET方法返回的预期对象应为"XMLInternalDocument" "XMLAbstractDocument"类(由XML2R预期)。

但是,在OECD请求的情况下,它返回类raw的对象。 SDMX EUROSTAT请求引发了类似的问题(例如http://ec.europa.eu/eurostat/SDMX/diss-web/rest/data/cdh_e_fos/..PC.FOS1.BE/?startperiod=2005&endPeriod=2011),但这里的原因是不同的,涉及XML2R包本身:使其适用于所有XML文件(无论XML网络的mimetype如何)请求),XML2R不应将GET content作为text,而应明确指定text/xml mimetype(表示content文档) 。这也是解决OECD问题所必需的(但还不够)(上游的修复,可能在curl,是必需的)

作为快速替代方案,我建议考虑使用rsdmx软件包,其软件包专门针对R中的SDMX数据和元数据文档的读取。

仅供参考,rsdmx不依赖于curlhttr,而是RCurl。关于新添加的BOM到OECD请求,最近在rsdmx中发布了一个修复程序,用于检查是否存在BOM并将其删除。然后rsdmx保证在R中正确读取SDMX XML对象,并将其解释为R SDMX对象。

希望这澄清

答案 1 :(得分:0)

您可以尝试使用RJSDMX(在CRAN或Github上)并避免解析XML。只需在查询中使用getTimeSeries函数,如果需要data.frame,则在结果上调用函数sdmxdf。

希望这有帮助。