基于R语言批量处理XML文件,为节点添加全局唯一标识符
用R批量给XML文件的
节点加全局唯一idno属性
直接上靠谱方案,用专门的XML处理包xml2来做,比正则稳多了,还能保证id全局不重复:
步骤说明
- 先安装需要的包:
xml2用来解析XML,fs方便遍历文件 - 遍历目标目录里的所有XML文件
- 对每个文件,提取文件名前缀(比如
news-1950.xml就取news-1950) - 找到所有
<div>节点,按顺序给每个加idno,格式是前缀-001、前缀-002这种 - 保存修改后的文件
完整代码示例
# 首次运行先安装依赖包 install.packages(c("xml2", "fs")) # 加载包 library(xml2) library(fs) # 替换成你的XML文件所在目录路径 xml_dir <- "./your-xml-folder" # 获取目录下所有XML文件的路径 xml_files <- dir_ls(xml_dir, regexp = "\\.xml$") # 逐个处理文件 for (file_path in xml_files) { # 提取文件名前缀(去掉.xml后缀) file_prefix <- path_file(file_path) |> tools::file_path_sans_ext() # 读取并解析XML文件 doc <- read_xml(file_path) # 定位所有<div>节点 div_nodes <- xml_find_all(doc, "//div") # 为每个<div>节点添加idno属性 for (i in seq_along(div_nodes)) { # 生成三位格式的序号(不足三位自动补0) seq_num <- sprintf("%03d", i) idno_value <- paste0(file_prefix, "-", seq_num) xml_set_attr(div_nodes[i], "idno", idno_value) } # 保存修改后的XML文件(直接覆盖原文件,需要备份可修改write_xml的输出路径) write_xml(doc, file_path) cat("处理完成:", file_path, "\n") }
为什么不推荐用正则?
别用gsub直接处理XML文本,万一遇到嵌套<div>、注释里的<div>或者属性中包含<div>字符串的情况,正则根本无法精准识别真实的节点,很容易改坏文件。xml2是基于XML结构解析的工具,能准确定位所有有效<div>节点,避免误操作。
全局唯一性保障
每个idno由唯一文件名前缀+文件内自增序号组成,只要你的文件名本身在目录中不重复,生成的idno就绝对全局唯一,完全规避了XSLTgenerate-id()可能跨文件重复的风险。
内容的提问来源于stack exchange,提问作者Will Hanley
相关产品推荐
相关产品推荐

