将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
相关产品推荐
相关产品推荐

