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

咨询在R中将XML文件转为Data Frame/Tbl/Data.table的最佳方法

将瑞士联邦税务管理局汇率XML转换为R数据结构的最佳方法

先处理文件下载与解压

目标链接是一个ZIP压缩包,首先需要下载并解压出XML文件:

# 下载ZIP文件到本地
download.file("https://www.ictax.admin.ch/extern/api/download/2619327/ea428026a27f772d57efbbcdc56bff62/kursliste_2022.zip", 
              destfile = "kursliste_2022.zip")
# 解压XML文件到当前工作目录
unzip("kursliste_2022.zip")

推荐方法:使用xml2包(现代XML处理工具)

xml2包的API更直观,处理层级XML结构更高效,配合dplyr可以快速转换成tibble(R中推荐的表格格式):

# 安装依赖包(首次运行时执行)
install.packages(c("xml2", "dplyr"))

library(xml2)
library(dplyr)

# 读取XML文档
doc <- read_xml("kursliste_2022.xml")

# 定位所有<Kurs>节点(这是包含汇率数据的核心节点)
kurs_nodes <- xml_find_all(doc, "//Kurs")

# 提取节点内的字段并转换为tibble
kurs_tbl <- tibble(
  货币代码 = xml_text(xml_find_first(kurs_nodes, "./Waehrung")),
  汇率日期 = xml_text(xml_find_first(kurs_nodes, "./Kursdatum")),
  买入价 = as.numeric(xml_text(xml_find_first(kurs_nodes, "./Einkaufskurs"))),
  卖出价 = as.numeric(xml_text(xml_find_first(kurs_nodes, "./Verkaufskurs"))),
  中间价 = as.numeric(xml_text(xml_find_first(kurs_nodes, "./Mittelkurs"))),
  单位数量 = as.integer(xml_text(xml_find_first(kurs_nodes, "./Einheit")))
)

# 查看前几行结果
head(kurs_tbl)

兼容你之前尝试的XML包方案

你之前用xmlParse+xmlToList得到的是多层嵌套列表,需要扁平化后才能转换为数据框:

install.packages("XML")
library(XML)

# 读取并解析XML
result <- xmlParse("kursliste_2022.xml")
xml_result <- xmlToList(result)

# 提取<Kursliste>下的所有<Kurs>节点列表
kurs_list <- xml_result$Kursliste$Kurs

# 将嵌套列表转换为数据框
kurs_df <- do.call(rbind.data.frame, kurs_list)

# 修正数据类型(默认是字符型,需要转成数值/整数)
kurs_df <- kurs_df %>%
  mutate(across(c(Einkaufskurs, Verkaufskurs, Mittelkurs), as.numeric),
         Einheit = as.integer(Einheit))

head(kurs_df)

为什么你之前的代码没成功?

xmlToList会把整个XML结构转成多层嵌套的列表,xml_structure只能帮你查看结构,但没有做扁平化处理——你需要手动提取核心数据节点(也就是Kurs节点),再把嵌套列表转换成表格格式。

内容的提问来源于stack exchange,提问作者BYA94

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:50:39