XML转DataFrame遇向量长度不匹配问题,求解决方案
解决XML提取字段后向量长度不一致无法创建tibble的问题
问题根源
你之前的做法是全局搜索所有EntityUin、EntityName、EntityZipCode节点,忽略了节点的父子归属关系。如果某个<Entity>节点缺失某个子字段(比如没有EntityZipCode),三个向量的长度就会不一致,导致无法合并成tibble。
解决方案:按父节点<Entity>分组提取
正确的思路是先定位所有<Entity>父节点,再从每个父节点内提取对应的子字段,这样每个<Entity>会对应一行数据,缺失的字段自动填充为NA,保证三个向量长度一致。
方法一:分步提取字段
library(tidyverse) library(xml2) # 1. 获取所有<Entity>父节点 entities <- xml_find_all(xml, ".//Entity") # 2. 从每个Entity节点提取对应字段,缺失时返回NA entity_uin <- map_chr(entities, ~xml_text(xml_find_first(., "./EntityUin"), trim = TRUE), .default = NA_character_) entity_name <- map_chr(entities, ~xml_text(xml_find_first(., "./EntityName"), trim = TRUE), .default = NA_character_) entity_zip_code <- map_chr(entities, ~xml_text(xml_find_first(., "./EntityZipCode"), trim = TRUE), .default = NA_character_) # 3. 创建tibble xml_tibble <- tibble(entity_uin, entity_name, entity_zip_code)
方法二:直接映射为tibble(更简洁)
用map_dfr直接将每个<Entity>节点转换为tibble的一行:
library(tidyverse) library(xml2) library(rlang) # 提供%||%函数处理NULL entities <- xml_find_all(xml, ".//Entity") xml_tibble <- map_dfr(entities, function(node) { tibble( entity_uin = xml_text(xml_find_first(node, "./EntityUin"), trim = TRUE) %||% NA_character_, entity_name = xml_text(xml_find_first(node, "./EntityName"), trim = TRUE) %||% NA_character_, entity_zip_code = xml_text(xml_find_first(node, "./EntityZipCode"), trim = TRUE) %||% NA_character_ ) })
如果不想依赖rlang,可以用ifelse替代%||%:
entity_uin = ifelse(is.null(xml_find_first(node, "./EntityUin")), NA_character_, xml_text(xml_find_first(node, "./EntityUin"), trim = TRUE))
内容的提问来源于stack exchange,提问作者NickD
相关产品推荐
相关产品推荐

