You need to enable JavaScript to run this app. 如何将含多级命名空间的eCH标准XML转换为每人一行的dataframe
优惠活动
大模型
产品
解决方案
定价
更多

如何将含多级命名空间的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 11:54:02