阅读'凌乱'将XML文件放入R中

时间:2015-11-06 19:28:27

标签: xml r dataframe

我正在尝试将一个XML文件作为数据框添加到R中,我可以轻松处理。我已经足够轻松地在线阅读了示例,但我找不到一个格式类似于我的XML文件的示例。它来自setup guide

以下是特定XML文件的URL:

US Treasury website

我想获得一个看起来像网站上的表格的数据框(日期,1mo,3mo,6mo,......)。以下代码正在运行但没有给我想要的结果。我怀疑这是因为XML文件比我一直在看的例子更复杂。

Ad<-'http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData?$filter=year(NEW_DATE)%20eq%202005'
XML <- xmlTreeParse(Ad)
xmltop <- xmlRoot(xmlfile)
XMLcat <- xmlSApply(xmltop, function(x) xmlSApply(x, xmlValue))
plantcat_df <- data.frame(t(XMLcat),row.names=NULL)

也不是

Data <- xmlToDataFrame(xml.url)

1 个答案:

答案 0 :(得分:3)

你真的很难读懂XML中的命名空间以及它们在R中的工作方式以及一般的XPath。此外,xml2是一个较新的XML pkg,并且有一些很好的功能,你应该看一下。

library(xml2)

# read the doc
doc <- read_xml("http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData?$filter=year(NEW_DATE)%20eq%202005")

# libxml2 + R == "meh" handling of default namespaces
ns <- xml_ns_rename(xml_ns(doc), d1="default")

# all the info is in the properties tag so focus on it
props <- xml_find_all(doc, "//default:entry/default:content/m:properties", ns)

# lots of ways to extract, but this data is "regular" enough to take a
# rather simplistic approach. Extract all the node values which will be 
# separated by newlines. Convert newlines to tabs, trim the whole thing
# and read it in as a table.
dat <- read.table(text=trimws(gsub("\n", "\t", unlist(lapply(props, xml_text)))), 
                  sep="\t", stringsAsFactors=FALSE)

# column names wld be good so build those from one property node
colnames(dat) <- xml_name(xml_children(props[[1]]))

# boom: done
str(dat)
## 'data.frame': 250 obs. of  14 variables:
##  $ Id              : int  3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 ...
##  $ NEW_DATE        : chr  "        2005-11-14T00:00:00" "        2005-11-10T00:00:00" "        2005-11-15T00:00:00" "        2005-11-17T00:00:00" ...
##  $ BC_1MONTH       : num  3.93 3.89 4.01 3.98 4 ...
##  $ BC_3MONTH       : num  4.02 3.97 4.01 4.01 4 ...
##  $ BC_6MONTH       : num  4.35 4.3 4.34 4.3 4.3 ...
##  $ BC_1YEAR        : num  4.4 4.34 4.38 4.32 4.34 ...
##  $ BC_2YEAR        : num  4.5 4.44 4.47 4.37 4.42 ...
##  $ BC_3YEAR        : num  4.52 4.48 4.5 4.39 4.43 ...
##  $ BC_5YEAR        : num  4.54 4.49 4.51 4.39 4.43 ...
##  $ BC_7YEAR        : num  4.57 4.51 4.52 4.42 4.45 ...
##  $ BC_10YEAR       : num  4.61 4.55 4.56 4.46 4.49 ...
##  $ BC_20YEAR       : num  4.9 4.85 4.83 4.75 4.77 ...
##  $ BC_30YEAR       : logi  NA NA NA NA NA NA ...
##  $ BC_30YEARDISPLAY: int  0 0 0 0 0 0 0 0 0 0 ...