2016-02-03 3 views
3

Я хочу извлечь курсы обмена из ECB website, чтобы конвертировать данные о моих местных валютах. Тем не менее, я много борюсь с использованием xpath (хотя this мне очень помог).Анализ XML до R

library(XML) 

fileURL <- "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml?93aad09b8f8b7bdb69cd1574b5b2665f" 
download.file(fileURL, destfile=tf <- tempfile(fileext=".xml")) 

xml_file <- xmlParse(tf) 
xml_data <- xmlRoot(xml_file) 

currency <- xml_data[["number(//Cube/@currency)"]] 
rate <- xml_data[["number(//Cube/@rate)"]] 

Тогда я просто хочу, чтобы создать простой кадр данных:

df <- data.frame(currency, rate) 

ответ

4

1) xpathSApply следующая строка дает матрицу символов m с валютой и скорости колонок:

m <- t(xpathSApply(xml_data, "//*[@rate]", xmlAttrs)) 

При необходимости в виде фрейма данных с символьными и числовыми столбцами добавьте это:

read.table(text = paste(m[, 1], m[, 2]), as.is = TRUE) 

Примечание: Мы избегали, чтобы иметь дело с пространствами имен с помощью * в выражении XPath, но если бы это было желательно явно ссылаться на Cube, так как в этом вопросе, то это будет сделано так:

m <- xpathSApply(xml_data, "//x:Cube[@rate]", xmlAttrs, namespaces = "x") 

2) read.pattern альтернативный способ для синтаксического анализа файла XML с помощью read.pattern в gsubfn. (Это не использовать пакет XML.)

library(gsubfn) 
read.pattern(tf, pattern = "'(...)' rate='([0-9.]+)'", col.names = c("currency", "rate")) 
+0

Отлично, ваш ответ работает намного лучше. –

+0

Это супер-крутой способ обойти бессмысленность пространства имен. – hrbrmstr

3

Альтернативный вариант ответа G в в Hadleyverse:

library(xml2) 
library(purrr) 
library(readr) 

fileURL <- "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml?93aad09b8f8b7bdb69cd1574b5b2665f" 
doc <- read_xml(fileURL) 
dat <- type_convert(map_df(xml_attrs(xml_find_all(doc, "//*[@rate]")), as.list)) 

dat 

## Source: local data frame [31 x 2] 
## 
## currency  rate 
##  (chr) (dbl) 
## 1  USD 1.0933 
## 2  JPY 130.5800 
## 3  BGN 1.9558 
## 4  CZK 27.0250 
## 5  DKK 7.4623 
## 6  GBP 0.7533 
## 7  HUF 310.5500 
## 8  PLN 4.3982 
## 9  RON 4.5093 
## 10  SEK 9.3580 
## ..  ...  ... 

Вы получаете типизированных столбцов в кадре данных с этим подходом, тоже.

+0

Выглядит хорошо, оба подхода работают для меня. Спасибо за оба решения! –

Смежные вопросы