【问题标题】:Parsing XML to R将 XML 解析为 R
【发布时间】:2016-02-03 15:29:27
【问题描述】:

我想从ECB website 中提取汇率来转换我的本地货币数据。但是,我在使用 xpath 时遇到了很多困难(尽管 this 帮了我很多)。

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)

【问题讨论】:

    标签: xml r xpath


    【解决方案1】:

    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 另一种方法是在 gsubfn 中使用 read.pattern 解析 XML 文件。 (这不使用 XML 包。)

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

    【讨论】:

    • 这也是一种解决命名空间废话的超酷方法。
    【解决方案2】:

    Hadleyverse 中 G 答案的替代版本:

    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
    ## ..      ...      ...
    

    您也可以使用这种方法在数据框中获得类型化的列。

    【讨论】:

    • 看起来不错,两种方法都适合我。感谢您提供两种解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多