R语言:将XML节点转为每行对应一个节点的data_frame报错求助
解决map_df调用nodeToDf时的错误
看起来你遇到的问题是因为nodeToDf函数内部的处理逻辑不对,导致map_df无法正确拼接成目标data frame。让我帮你分析并修复这个问题:
问题根源
你的nodeToDf函数里,xml_attrs(theNode)返回的是单个节点的命名属性向量(比如针对示例中的book节点,会返回c(title = "First", pages = "100"))。之后你用map_dfr(~as.list(.)),这里的map会遍历这个向量的每一个元素,把每个属性拆成单独的行,这完全违背了你想要“每行对应一个节点”的需求,自然会触发错误。
修复后的函数
我们只需要把单个节点的属性直接转换成单行的data frame即可,不需要多余的map_dfr操作:
library(tidyverse) library(xml2) nodeToDf <- function(theNode) { # 将单个节点的属性直接转为单行tibble xml_attrs(theNode) %>% as.list() %>% tibble::as_tibble_row() } # 或者更简洁的写法 nodeToDf <- function(theNode) { tibble::as_tibble_row(xml_attrs(theNode)) }
测试验证
用你的示例代码测试:
data <- read_xml("<root><book title='First' pages='100'/></root>") books <- xml_find_all(data, "//book") # 调用map_df得到正确结果 result <- map_df(books, nodeToDf) print(result)
输出结果应该是符合预期的单行data frame:
# A tibble: 1 × 2 title pages <chr> <chr> 1 First 100
如果你的实际场景中还有更复杂的逻辑(比如需要处理节点内部的文本或子节点),只需要在这个基础上扩展即可——核心是确保nodeToDf返回的始终是单行的data frame/tibble,这样map_df就能正确拼接所有节点的结果。
内容的提问来源于stack exchange,提问作者Bas Jansen
相关产品推荐
相关产品推荐

