如何提取XML中特定id(REF_AREA)的节点值
解决R语言提取ECB XML中REF_AREA国家代码的问题
问题分析
你的代码返回全NA的原因有两个:
- 第二次使用
xml_find_all("//generic:Value")时,//会全局遍历整个XML文档,而非在每个SeriesKey节点下查找,导致上下文错误。 xml_attr("REF_AREA")是尝试获取名为REF_AREA的属性,但实际上<generic:Value>节点的结构是<generic:Value id="REF_AREA" value="AT"/>——你需要先筛选id属性等于REF_AREA的节点,再提取它的value属性。
正确实现方式
方式一:精准XPath直接定位
用XPath表达式直接筛选目标节点,一步到位:
library(httr2) library(xml2) library(tidyverse) # 请求并解析XML 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() # 提取所有id为REF_AREA的Value节点的value属性 ref_area_codes <- xml_find_all(resp_xml, "//generic:SeriesKey/generic:Value[@id='REF_AREA']") %>% xml_attr("value") # 查看去重后的国家代码 unique(ref_area_codes)
方式二:分步遍历(更清晰)
如果需要更明确的分步逻辑,可以用purrr遍历每个SeriesKey节点:
# 获取所有SeriesKey节点 series_keys <- xml_find_all(resp_xml, "//generic:SeriesKey") # 遍历每个SeriesKey,提取对应REF_AREA的value ref_area_codes <- map_chr(series_keys, function(key_node) { xml_find_first(key_node, "./generic:Value[@id='REF_AREA']") %>% xml_attr("value") }) # 查看结果 ref_area_codes
关键说明
- XPath中,
./表示当前节点的子节点,避免全局搜索的问题。 [@id='REF_AREA']是属性筛选条件,用于定位特定id的节点。xml_attr("value")提取节点的value属性值,这才是你需要的国家代码。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

