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

将HML格式XML文件读取到R表格:提取样本ID与glstring

提取HML格式XML中的样本ID与glstring内容

问题背景

有一个大体积的HML专用XML文件,包含数百个样本数据,需要提取每个样本的id属性,以及该样本对应的所有glstring节点文本内容。已使用xml2包读取文件,但不清楚如何从sample节点开始提取目标数据。

解决方案

由于HML XML带有默认命名空间,直接使用XPath查询会找不到节点,需要先处理命名空间,再批量提取数据:

步骤1:加载包并读取文件,定义命名空间

library(xml2)
# 可选:用purrr批量处理更简洁,也可以用基础R循环
library(purrr)
library(tibble)

# 读取HML文件
test <- read_xml("test.hml")
# 获取XML的命名空间(HML默认命名空间会自动生成前缀d1)
ns <- xml_ns(test)

步骤2:定位所有sample节点

无需手动跳过前2个节点,直接用XPath匹配所有sample节点:

sample_nodes <- xml_find_all(test, ".//d1:sample", ns = ns)

步骤3:批量提取样本ID与对应的glstring

用map_df遍历每个sample节点,提取属性和文本,生成结构化数据框:

result <- map_df(sample_nodes, function(node) {
  # 提取当前样本的id属性
  sample_id <- xml_attr(node, "id")
  # 提取当前样本下所有glstring的文本内容
  glstrings <- xml_find_all(node, ".//d1:glstring", ns = ns) %>% xml_text()
  # 生成数据框,一个glstring对应一行
  tibble(sample_id = sample_id, glstring = glstrings)
})

如果不用purrr,可以用基础R循环实现:

# 初始化空数据框
result <- data.frame(
  sample_id = character(),
  glstring = character(),
  stringsAsFactors = FALSE
)

# 遍历每个sample节点
for (node in sample_nodes) {
  sample_id <- xml_attr(node, "id")
  glstrings <- xml_find_all(node, ".//d1:glstring", ns = ns) %>% xml_text()
  # 将当前样本的结果追加到数据框
  result <- rbind(result, data.frame(
    sample_id = rep(sample_id, length(glstrings)),
    glstring = glstrings,
    stringsAsFactors = FALSE
  ))
}

关键说明

  • 命名空间处理:HML XML带有默认命名空间http://schemas.nmdp.org/spec/hml/1.0.1,XPath查询必须带上命名空间前缀(此处为d1)才能正确匹配节点。
  • XPath路径:.//d1:sample会匹配XML中所有层级的sample节点,无需关心其在根节点下的位置;.//d1:glstring会匹配当前sample节点下所有的glstring子节点。

内容的提问来源于stack exchange,提问作者Nick Brown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:15:37