如何将选举结果XML文件导入R并转换为可用数据框
R导入Clarity选举XML结果文件解决方案
1 问题核心原因
你遇到的返回NULL、报错问题核心是该类选举XML文件为嵌套层级结构,且带有默认命名空间,直接转列表或未注册命名空间就查找节点都会失效。
2 依赖包准备
需要用到以下工具包:
xml2:用于XML节点解析dplyr/purrr:用于批量处理节点、整理为结构化数据框
安装加载代码:
# 仅首次运行需要执行安装 install.packages(c("xml2", "dplyr", "purrr")) # 加载包 library(xml2) library(dplyr) library(purrr)
3 分步解析代码
3.1 读取文件并注册命名空间
# 替换为你本地存储的Detail XML文件路径 xml_path <- "你本地的文件路径/detail.xml" xml_doc <- read_xml(xml_path) # 注册XML自带的命名空间,这是避免节点查找为空的核心步骤 ns <- xml_ns(xml_doc)
3.2 批量提取节点生成数据框
以下代码可以提取所有竞选项目、候选人、党派、总得票数据,如需选区级细粒度得票,可再嵌套遍历
# 提取所有竞选项目节点 contest_nodes <- xml_find_all(xml_doc, ".//d1:Contest", ns = ns) # 遍历所有节点生成结构化数据框 election_result <- map_dfr(contest_nodes, function(contest) { # 提取当前竞选项目名称 contest_name <- xml_attr(contest, "text") # 提取当前竞选项目下所有候选人/选项节点 choice_nodes <- xml_find_all(contest, ".//d1:Choice", ns = ns) map_dfr(choice_nodes, function(choice) { # 提取候选人属性,无属性值时默认填充NA避免报错 choice_name <- xml_attr(choice, "text") party <- xml_attr(choice, "party") %||% NA_character_ total_votes <- xml_attr(choice, "votes") %>% as.integer() tibble( 竞选项目 = contest_name, 候选人 = choice_name, 党派 = party, 总得票数 = total_votes ) }) })
3.3 结果验证
# 查看前10条解析结果 head(election_result, 10) # 统计空值数量确认解析完整性 sum(is.na(election_result))
4 常见问题修复
- 节点查找返回空值:确认
xml_find_all函数已传入ns = ns参数,未注册命名空间无法识别该XML的节点 - 迭代过程报错:对可能缺失的属性用
%||% NA_character_设置缺省值,避免NULL打断迭代 - 出现乱码:读取文件时指定编码
read_xml(xml_path, encoding = "UTF-8")
内容的提问来源于stack exchange,提问作者Abigail
相关产品推荐
相关产品推荐

