在R中解析XML

问题描述:

我试图从XML文件中下载和组织一些数据到R中。我查看了相关的问题和文档,但大多数人都提到使用xml包解析函数,这似乎不是能够弄清楚我的数据。所以我的两个问题是1)如何让R将实际数据读入数据框而不是XML结构并标记出来?和2)我可以使用XML代码中的XML结构信息来解析它在R中吗?在R中解析XML

这是我与工作(和我的失败尝试至今):

library("XML") 
datahere = c("C:/.../R/feddata/data/") 
setwd(datahere) 

download.file("http://www.newyorkfed.org/markets/pomo/xml/v3_0/pomoXML.cfm?SHOWMORE=TRUE&date1=01/01/2009&date2=01/10/2009",paste(datahere,"feddata.xml",sep="")) 

feddata = xmlInternalTreeParse("feddata.xml") 
feddataset = xmlRoot(feddata) 
names(feddata) 
feddatanodeset = getNodeSet(feddata,"//DataSet/*") 
feddatalist = xmlToList("feddata.xml") 
feddatalist[2][1][1] 
feddataDF = xmlToDataFrame(feddata) 
feddata$doc$file$DataSet 
feddata["doc"]["file"]["DataSet"] 

feddataRoot = xmlRoot(feddata) 
feddata2 = xmlSApply(feddata, function(x) xmlSApply(x,xmlValue)) 
feddata2 = xmlSApply(feddata$DataSet, function(x) xmlSApply(x,xmlValue)) 

想法,建议,意见,等等都极大的赞赏。如果你知道另一个堆栈问题,或者某个地方可以使用的教程或示例,那也可以工作,不想冗余。谢谢!

+0

哪些信息你尝试从该XML文档中提取? – agstudy

+0

我只是想像Scott和Ramnath那样得到数据的数据观察结果。我会试着在未来的问题上更具体一些,但我认为这是在这方面做出新的努力的困难之一 - 并不知道要问的正确问题。 – DaedalusBloom

这是你想要的吗?

library(XML) 
datahere = "~/" 
setwd(datahere) 
download.file("http://www.newyorkfed.org/markets/pomo/xml/v3_0/pomoXML.cfm?SHOWMORE=TRUE&date1=01/01/2009&date2=01/10/2009",paste(datahere,"feddata.xml",sep="")) 
tt = xmlParse("feddata.xml") 
out <- getNodeSet(tt, "//*[name()='out:issue']", fun=xmlToList) 
df <- data.frame(do.call(rbind, out)) 
head(df) 

    confidentiality couponRate currency decimals inclusion maturityDate multiplier rate securityType status 
1    F  4.750  USD  0  true 2011-01-18   0 P   FMC  A 
2    F  4.500  USD  0  true 2011-02-15   0 P   FNM  A 
3    F  4.625  USD  0  true 2011-02-18   0 P   FHL  A 
4    F  3.250  USD  0  true 2011-02-25   0 P   FMC  A 
5    F  5.500  USD  0  true 2011-03-15   0 P   FNM  A 
6    F  5.625  USD  0  true 2011-03-15   0 P   FMC  A 
     value 
1 40000000 
2 3000000 
3 2000000 
4   0 
5 49000000 
6 155000000 
+0

啊,我试过这种方法,但无法让do.call(rbind)工作。这很有帮助,因为我可以看到我做错了什么,这主要是不了解xml文件本身的组织。谢谢! – DaedalusBloom

+0

奇怪的是,'do.call'和'rbind'是基于R – sckott

+0

噢,我不是说这些函数有问题,我的意思是我没有正确使用它们。更具体地说,当试图解析XML时,文件顶部不是数据观察的信息显然不能被观察到。基本上我真的不知道如何正确导航XML,这是你用“// * [name()='out:issue']”步骤澄清的。我确定这是我对XML结构缺乏经验的原因,但对于您的示例来说,它很有启发性。再次感谢! – DaedalusBloom

使用plyrXML另一种解决方案

library(XML) 
doc <- xmlParse(
    "http://www.newyorkfed.org/markets/pomo/xml/v3_0/pomoXML.cfm?SHOWMORE=TRUE&date1=01/01/2009&date2=01/10/2009" 
) 
doc_list <- xmlToList(doc) 

library(plyr) 
doc_issues <- ldply(doc_list$DataSet$Group, function(d){ 
    if ("issue" %in% names(d)){ 
    d$issue 
    } else { 
    NULL 
    } 
}) 
+0

这也有窍门。我需要更熟悉plyr软件包,但我从来没有真正知道何时想到它。谢谢一堆! – DaedalusBloom