library(data.table)
library(rlist)
library(pipeR)
library(httr)
library(jsonlite)
library(xml2)
library(rsdmx)
library(RCurl)
url <- 'https://sdw-wsrest.ecb.europa.eu/service/data/EXR/M.USD.EUR.SP00.A'
doc <- readSDMX(url) 
doc %>>%
str(2)
doc %>>%
as.data.frame %>>%
data.table ->
    data
url <- 'https://sdw-wsrest.ecb.europa.eu/service/data/EXR/'
doc <- readSDMX(url) 
doc %>>%
str(2)
doc %>>%
as.data.frame %>>%
data.table ->
    data
## -------------------------------------------------------------------------- ##
## Get all codelists                                                          ##
## -------------------------------------------------------------------------- ##
url = 'https://sdw-wsrest.ecb.europa.eu/service/codelist?detail=allstubs'
doc <- readSDMX(url) 
doc %>>%
as.data.frame %>>%
data.table ->
    data
doc %>>%
(codelists) %>>%
list.map({
    . %>>%
    ({
        x <- .
        x %>>% slotNames %>>%
        list.map({
            slot(x,.) %>>% unlist
        }) %>>%
        list.filter(!is.null(.)) %>>%
        as.data.frame %>>%
        data.table
    })  
}) %>>%
rbindlist(fill = TRUE) ->
    o
o %>>% (Name)
o %>>% (agencyID) %>>% unique
resource = 'structure'
o[, query := sprintf('https://sdw-wsrest.ecb.europa.eu/service/%s/%s/%s/%s?detail=allstubs',
              resource,
              agencyID,
              id,
              version)]
o$query %>>%
list.map({
    readSDMX(.) %>>%
    as.data.frame
}) ->
    o2
str(o2,1)
url <- 'https://sdw-wsrest.ecb.europa.eu/service/structure/IMF/CL_VALUATION/1.0?detail=allstubs'
doc <- readSDMX(url)
doc %>>% as.data.frame
url = 'https://sdw-wsrest.ecb.europa.eu/service/dataflow/ECB'
url = 'https://sdw-wsrest.ecb.europa.eu/service/datastructure/ECB/all/latest'
doc <- readSDMX(url)
doc <- getURL(url)
doc <- xml2::read_xml(url)
xml_children(doc)
xml_structure(doc)
xml_ns(doc)
xml_name(doc)
doc %>>%
xml_children %>>%
list.map({
    . %>>% xml_children %>>% xml_name
})
ns <- xml_ns(doc)
doc %>>% xml_structure
doc %>>% xml_find_all('//str:DataStructure', ns = ns) ->
    nodes
nodes %>>% 
list.map({
    . %>>% xml_structure
})
nodes[[1L]] %>>% xml_structure
nodes[[1L]] %>>% xml_attrs
nodes[[1L]] %>>% xml_find_all('//com:Name',ns = ns)
nodes %>>% xml_find_all('//com:Name',ns = ns) %>>% xml_text
nodes %>>% xml_attrs %>>%
list.map({
    . %>>% as.list %>>% as.data.frame %>>% data.table
}) %>>% rbindlist(fill = TRUE) ->
    static
static[, label := {
    nodes %>>% xml_find_all('//com:Name',ns = ns) %>>% xml_text
}]
## Download data
url = 'https://sdw-wsrest.ecb.europa.eu/service/data/AME'
doc <- readSDMX(url)
doc %>>% as.data.frame %>>% data.table ->
    o
doc <- xml2::read_xml(url)
options(width = 120)
static[,list(id,label)]
url = 'https://sdw-wsrest.ecb.europa.eu/service/data/IVF'
doc <- readSDMX(url)
doc %>>% as.data.frame %>>% data.table ->
    ogma
o$TITLE %>>% unique
doc <- xml2::read_xml(url)
ns <- xml_ns(doc)
doc %>>% xml_children %>>% (.[[2L]]) %>>% xml_children
doc %>>% xml_structure
doc %>>% xml_attrs
doc %>>% xml_find_all('.//generic:Series',ns = ns) ->
    nodes
nodes %>>% str(1)
nodes[[2L]] %>>% xml_children
nodes[[2L]] %>>% xml_structure
nodes[[2L]] %>>% xml_find_all('./generic:SeriesKey/generic:Value',ns = ns) %>>% xml_attrs
nodes[[2L]] %>>% xml_find_all('./generic:Attributes/generic:Value',ns = ns) %>>% xml_attrs
nodes[[2L]] %>>% xml_find_all('./generic:Obs',ns = ns) %>>% xml_structure
nodes[[2L]] %>>% xml_find_all('./generic:Obs/generic:ObsDimension',ns = ns) %>>% xml_attrs
nodes[[2L]] %>>% xml_find_all('./generic:Obs/generic:ObsValue',ns = ns) %>>% xml_attrs
nodes[[2L]] %>>% xml_find_all('./generic:Obs/generic:Attributes',ns = ns) %>>% xml_attrs
nodes %>>% xml_find_all('//generic:Obs',ns = ns)
nodes %>>% xml_find_all('//generic:SeriesKey',ns = ns)
nodes[[1L]] %>>% xml_structure
nodes[[1L]] %>>%
xml_find_all('.//generic:SeriesKey',ns = ns) %>>%
xml_find_all('.//generic:Value',ns = ns) %>>%
xml_attrs %>>%
list.map({
    . %>>% as.list %>>% as.data.table
}) %>>%
rbindlist
nodes[[1L]] %>>%
xml_find_all('.//generic:Attributes',ns = ns) %>>%
xml_find_all('.//generic:Value',ns = ns) %>>%
xml_attrs %>>%
list.map({
    o <- .[['value']]
    names(o) <- .[['id']]
    o
}) %>>%
do.call(what = 'c') %>>%
as.list %>>% as.data.table
idvaluelist2dt <- function(l){
    l %>>%
    list.map({
        o <- try(.[['value']])
        if (inherits(o,'try-error'))
            o <- NA
        
        names(o) <- try(.[['id']])
        if (inherits(names(o),'try-error'))
            names(o) <- 'Unknown'        
        o
    }) %>>%
    do.call(what = 'c') %>>%
    as.list %>>% as.data.table
}
doc <- xml2::read_xml(url)
ns <- xml_ns(doc)
doc %>>% xml_find_all('.//generic:Series',ns = ns) ->
    nodes
nodes %>>% str(1)
nodes[[2L]] %>>% xml_children
nodes[[2L]] %>>% xml_structure
nodes[[2L]] %>>% xml_find_all('./generic:SeriesKey/generic:Value',ns = ns) %>>% xml_attrs
nodes[[2L]] %>>% xml_find_all('./generic:Attributes/generic:Value',ns = ns) %>>% xml_attrs -> l
nodes[[2L]] %>>% xml_find_all('./generic:Obs',ns = ns) %>>% xml_structure
nodes[[2L]] %>>% xml_find_all('./generic:Obs/generic:ObsDimension',ns = ns) %>>% xml_attrs
nodes[[2L]] %>>% xml_find_all('./generic:Obs/generic:ObsValue',ns = ns) %>>% xml_attrs
nodes[[2L]] %>>% xml_find_all('./generic:Obs/generic:Attributes',ns = ns) %>>% xml_attrs
l %>>% idvaluelist2dt
nodes[1] %>>% 
list.map({
    cat(sprintf('Processed node %s out of %s\n',.i, length(nodes)))
    . %>>%
    xml_find_all('./generic:Attributes/generic:Value',ns = ns) %>>%
    xml_attrs %>>% as.list %>>%
    list.map({
        l <- .
        o <- l[[2L]]
        names(o) <- l[[1L]]    
        o 
    }) %>>% do.call(what = 'c') %>>%
    as.list %>>% as.data.table ->
        part1
    . %>>%
    xml_find_all('./generic:SeriesKey/generic:Value',ns = ns) %>>%
    xml_attrs %>>% as.list %>>%
    list.map({
        l <- .
        o <- l[[2L]]
        names(o) <- l[[1L]]    
        o 
    }) %>>% do.call(what = 'c') %>>%
    as.list %>>% as.data.table ->
        part2
    . %>>%
    xml_find_all('./generic:Obs/generic:ObsDimension',ns = ns) %>>%
    xml_attrs %>>% as.list %>>%
    list.map(value) %>>%
    unlist ->
        part3
    . %>>%
    xml_find_all('./generic:Obs/generic:ObsValue',ns = ns) %>>%
    xml_attrs %>>% as.list %>>%
    list.map(value) %>>%
    unlist ->
        part4         
    cbind(part1, part2, date = part3, value = part4)
}) %>>% rbindlist(fill = TRUE) ->
    test
out %>>% (TITLE) %>>% unique
out %>>%
list.map({
    l <- .
    o <- l[[2L]]
    names(o) <- l[[1L]]    
    o 
}) %>>% do.call(what = 'c') %>>%
as.list %>>% as.data.table
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.