You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:24:21