咨询在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
相关产品推荐
相关产品推荐

