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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:19:15