如何将含多级命名空间的eCH标准XML转换为每人一行的dataframe
问题原因
你当前遇到的字段挤在同一列的问题,是因为reportedPerson节点是多层嵌套结构,xmlToList会保留XML的层级生成嵌套列表,直接rbind只会保留最外层结构,内层嵌套字段不会自动展开。
解决方案
你可以使用purrr包的递归展平工具处理嵌套列表,再批量拼接为数据框,示例代码如下:
1. 安装加载依赖包
# 未安装的包先执行 install.packages(c("XML", "purrr", "dplyr")) library(XML) library(purrr) library(dplyr)
2. 完整处理代码
# 原有XML解析、命名空间处理逻辑不变 doc <- xmlParse('/path/to/Quelle/Response.xml') nsDefs <- xmlNamespaceDefinitions(doc) ns <- structure(sapply(nsDefs, function(x) x$uri), names = names(nsDefs)) names(ns)[1] <- "x" # 提取所有reportedPerson节点为列表 reportedPerson_list <- getNodeSet(doc, "//x:reportedPerson", namespaces=ns, fun=xmlToList) # 定义展平函数:递归展开所有嵌套层级,用下划线拼接层级作为列名,同名字段自动加序号 flatten_person <- function(person_node) { flatten_depth(person_node, .depth = Inf, .names_sep = "_") } # 批量处理所有人员记录,直接生成结构化数据框 df <- map_dfr(reportedPerson_list, flatten_person)
输出说明
生成的df每行对应1个人员,所有嵌套字段会自动展开为独立列,列名按原XML层级拼接,例如baseData_person_personIdentification_vn、baseData_person_nameData_firstName,你可以根据需要用rename()或rename_with()函数调整列名。
如果遇到多条重复结构的节点(比如示例中的多个otherPersonId),工具会自动在列名后加序号区分,例如otherPersonId_1_personId、otherPersonId_2_personId。
内容的提问来源于stack exchange,提问作者an_ja
相关产品推荐
相关产品推荐

