在R中修复XML转DataFrame层级丢失:扩展名称字段
解决XML层级结构丢失问题的方案
核心思路
直接从XML节点提取时保留层级关系,通过遍历每个Account节点的祖先节点,拼接出包含父账户名称的完整标识,避免转换为DataFrame后再补全层级的麻烦。
完整代码实现
首先加载所需包:
library(xml2) library(purrr) library(dplyr)
解析XML文档(假设你的XML内容已存入doc对象):
# 若XML来自文件,可使用此方式解析 # doc <- read_xml("your_budget.xml") # 提取所有Account节点(包括嵌套的子节点) accounts <- xml_find_all(doc, "//Account")
定义函数生成带层级的完整名称:
get_full_hierarchical_name <- function(node) { # 获取当前节点的所有Account类型祖先节点 ancestor_names <- xml_parents(node) %>% xml_filter(xml_name(.) == "Account") %>% xml_attr("name") %>% rev() # 反转顺序,确保从顶层父节点到直接父节点 # 拼接祖先名称与当前节点名称 current_name <- xml_attr(node, "name") paste(c(ancestor_names, current_name), collapse = "") }
生成包含层级信息的DataFrame:
budget_df <- tibble( step = xml_attr(accounts, "step") %>% as.integer(), original_name = xml_attr(accounts, "name"), full_name = map_chr(accounts, get_full_hierarchical_name), value = xml_attr(accounts, "value") %>% as.numeric() )
代码说明
- 节点选择修正:原代码中
xml_find_all(doc, "//Budget")仅获取顶层Budget节点,改为//Account才能提取所有嵌套的账户节点。 - 层级名称生成:通过
xml_parents遍历当前节点的父节点,筛选出Account类型的祖先并提取名称,反转后与当前节点名称拼接,得到如a1、a1.1、b1这类带父级标识的名称。 - 类型转换:将
step转为整数、value转为数值类型,方便后续用dplyr和ggplot2进行分析。
原问题分析
你之前尝试用循环或case_when补全层级失败,本质是因为转换为DataFrame时已经丢失了XML的节点父子关系,事后补全需要额外的逻辑关联,不如在提取节点时直接保留层级信息更高效。
内容的提问来源于stack exchange,提问作者aibe0815
相关产品推荐
相关产品推荐

