You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取XML中特定id(REF_AREA)的节点值

解决R语言提取ECB XML中REF_AREA国家代码的问题

问题分析

你的代码返回全NA的原因有两个:

  1. 第二次使用xml_find_all("//generic:Value")时,//会全局遍历整个XML文档,而非在每个SeriesKey节点下查找,导致上下文错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:37:34