R语言将含多层嵌套列表的多列表XML转换为DataFrame方法咨询
USPTO嵌套XML转R DataFrame实现方法
USPTO专利批量XML属于典型的多层异构嵌套结构,直接对根节点转list后逐层unnest很容易出现列错位、长度不匹配的问题,按以下步骤处理可以稳定得到规范的矩形数据结构:
- 前置依赖包准备
# 加载所需包,未安装的先执行install.packages()安装对应包 library(xml2) library(dplyr) library(purrr) library(tibble) library(tidyr)
- 第一步:跳过根节点包装层,直接定位单条专利记录节点
不要直接对整个XML根节点执行as_list(),先通过XPath定位到所有独立的专利记录子节点,从根源避免根节点无关字段导致的行错位:
# 读取本地XML文件 xml_doc <- read_xml("E:\\IIMU\\Databases\\USPTO\\2020-2022-pairbulk-full-20220613-xml\\2022.XML") # 提取PatentBulkData节点下所有单条专利记录 patent_nodes <- xml_find_all(xml_doc, ".//PatentBulkData/*")
- 第二步:编写递归转换函数,自动拉平嵌套节点
写一个通用递归函数,把任意深度的嵌套节点自动拉平为单行结构,对多值重复节点自动生成列表列,不需要手动逐层写unnest逻辑:
node_to_flat <- function(current_node) { # 提取当前节点下所有子节点 child_nodes <- xml_children(current_node) node_values <- map(child_nodes, ~{ # 非叶子节点递归处理 if (length(xml_children(.x)) > 0) { node_to_flat(.x) } else { # 叶子节点取文本值,空值填充NA txt <- xml_text(.x, trim = TRUE) ifelse(nchar(txt) == 0, NA_character_, txt) } }) # 绑定节点名作为列名,处理同名字段 names(node_values) <- xml_name(child_nodes) node_values <- split(node_values, names(node_values)) |> map(~if (length(.x) == 1) .x[[1]] else as.list(.x)) return(node_values) }
- 第三步:批量转换合并为DataFrame
遍历所有专利节点,直接合并为tibble格式的DataFrame:
uspto_patent_df <- map_dfr(patent_nodes, ~as_tibble_row(node_to_flat(.x)))
- 后续处理提示:如果有重复多值字段(比如多发明人、多法律状态、多分类号),上述代码会自动将这类字段存储为列表列,需要展开时单独对目标列调用
unnest_longer()(长格式展开)或unnest_wider()(宽格式展开)即可,不会影响其他字段的行对齐。如果处理的是GB级超大XML文件,可以把单节点转换逻辑接入xmlEventParse流处理接口,避免全量加载导致内存不足。
内容的提问来源于stack exchange,提问作者PhD Student
相关产品推荐
相关产品推荐

