如何引用具有特定id的XML节点

问题描述 投票:0回答:1

我正在尝试解析 API 返回的 XML,如下所示:

library(httr2)
library(xml2)
library(tidyverse)

resp_xml <- request("https://data-api.ecb.europa.eu/service/data/CBD2/A..W0.11._Z._Z.A.A.A0000._X.ALL.CA._Z.LE._T.EUR") %>%
  req_perform() %>%
  resp_body_xml()

xml2::xml_find_all(resp_xml, "//generic:SeriesKey") %>% 
  xml2::xml_find_all("//generic:Value")

如何仅提取 id="REF_ARA" 的值?我想获取仅包含“AT”、“BE”等国家/地区代码的列表。我已经尝试过类似的操作,但我只得到 NA:

xml2::xml_find_all(resp_xml, "//generic:SeriesKey") %>% 
  xml2::xml_find_all("//generic:Value") %>% 
  xml2::xml_attr("REF_AREA")
r xml xml-parsing xml2
1个回答
0
投票

如果您想获取

id="REF_AREA"
的值,您可以这样做:

xml_find_all(resp_xml, "//generic:SeriesKey") %>% 
  xml_find_all("//generic:Value") %>% 
  .[xml_attr(., "id") == "REF_AREA"] %>% 
  xml_attr("value")

#>  [1] "AT" "B0" "BE" "BG" "CY" "CZ" "DE" "DK" "EE" "ES" "FI" "FR" "GB" "GR" "HR"
#> [16] "HU" "IE" "IT" "LT" "LU" "LV" "MT" "NL" "PL" "PT" "RO" "SE" "SI" "SK" "U2"

或者如果您想要节点集,则跳过最后一行:

xml_find_all(resp_xml, "//generic:SeriesKey") %>% 
  xml_find_all("//generic:Value") %>% 
  .[xml_attr(., "id") == "REF_AREA"]

#> {xml_nodeset (30)}
#>  [1] <generic:Value id="REF_AREA" value="AT"/>
#>  [2] <generic:Value id="REF_AREA" value="B0"/>
#>  [3] <generic:Value id="REF_AREA" value="BE"/>
#>  [4] <generic:Value id="REF_AREA" value="BG"/>
#>  [5] <generic:Value id="REF_AREA" value="CY"/>
#>  [6] <generic:Value id="REF_AREA" value="CZ"/>
#>  [7] <generic:Value id="REF_AREA" value="DE"/>
#>  [8] <generic:Value id="REF_AREA" value="DK"/>
#>  [9] <generic:Value id="REF_AREA" value="EE"/>
#> [10] <generic:Value id="REF_AREA" value="ES"/>
#> [11] <generic:Value id="REF_AREA" value="FI"/>
#> [12] <generic:Value id="REF_AREA" value="FR"/>
#> [13] <generic:Value id="REF_AREA" value="GB"/>
#> [14] <generic:Value id="REF_AREA" value="GR"/>
#> [15] <generic:Value id="REF_AREA" value="HR"/>
#> [16] <generic:Value id="REF_AREA" value="HU"/>
#> [17] <generic:Value id="REF_AREA" value="IE"/>
#> [18] <generic:Value id="REF_AREA" value="IT"/>
#> [19] <generic:Value id="REF_AREA" value="LT"/>
#> [20] <generic:Value id="REF_AREA" value="LU"/>
#> ...

创建于 2023-12-06,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.