在R中从多个XML文件生成文本DataFrame时遇报错的解决求助
解决R中读取多个XML文件生成DataFrame的问题
我来帮你搞定这个问题~你遇到的Error: 'x' must be a string of length 1错误,主要是因为代码里的管道操作和函数调用逻辑有点小问题,咱们调整一下就能正常运行了:
错误原因分析
原来的代码里,map_dfr的回调逻辑没处理好——你直接把read_xml(.) %>% xml_text(., trim = TRUE) %>% tibble()丢进去,这里的参数传递和管道衔接出现了混淆,而且Vectorize完全是多余的,因为dir_ls已经帮你列出了所有XML文件路径,map_dfr本身就可以遍历这些路径。
修改后的代码
下面是调整后的完整代码,不仅能解决错误,还会给你生成的DataFrame加上文件名列,方便你溯源每个文本来自哪个文件:
library(tidyverse) library(xml2) read_texts <- function(folder) { # 列出目标文件夹下所有XML文件 dir_ls(folder, glob = "*.xml") %>% # 遍历每个文件路径,生成包含文件名和文本的tibble map_dfr(function(file_path) { # 读取XML文档 xml_document <- read_xml(file_path) # 提取整个文档的文本,并整理成tibble tibble( file_name = basename(file_path), # 保留文件名 text = xml_text(xml_document, trim = TRUE) # 提取并修剪文本 ) }) } # 调用函数生成DataFrame all_texts_df <- read_texts("forfatterskab")
额外优化(按需选择)
如果你的XML不是要提取整个文档的文本,而是特定节点的内容(比如所有<article>节点),可以把xml_text换成先定位节点再提取文本的逻辑,示例如下:
# 提取XML中所有<article>节点的文本,并合并成字符串 tibble( file_name = basename(file_path), text = xml_document %>% xml_find_all("//article") %>% # 定位所有<article>节点 xml_text(trim = TRUE) %>% str_c(collapse = "\n") # 把多个节点的文本合并成一个字符串 )
这样修改后,你就能得到一个包含所有XML文件文本的单一DataFrame啦~
内容的提问来源于stack exchange,提问作者Victor Harbo
相关产品推荐
相关产品推荐

