从XML提取数据时,缺失节点返回缺失值的实现方法
解决方法
要生成与<Trial>节点数量一致的结果向量,需要先遍历所有<Trial>节点,再逐个提取每个节点内的<plouf>文本,缺失时返回NA:
代码实现
library(xml2) test_xml <- " <test> <Trial> <ID> 1 </ID> <plouf> plouf </plouf> </Trial> <Trial> <ID> 2 </ID> </Trial> </test>" test <- as_xml_document(test_xml) # 1. 先获取所有Trial节点 all_trials <- xml_find_all(test, "//Trial") # 2. 逐个提取每个Trial下的plouf文本,无则返回NA plouf_results <- sapply(all_trials, function(trial_node) { plouf_node <- xml_find_first(trial_node, "./plouf") if (is.na(plouf_node)) NA_character_ else xml_text(plouf_node) }) # 查看结果 plouf_results
运行结果
[1] " plouf " NA
原理说明
你之前用xml_find_all("//plouf")直接提取所有<plouf>节点,只会返回存在该节点的结果,自然会跳过没有<plouf>的<Trial>,导致结果长度和Trial数量不一致。
而先定位所有<Trial>节点,再对每个节点使用xml_find_first查找内部的<plouf>:
- 如果找到节点,就提取文本;
- 如果找不到(返回
NA),就填充NA_character_,这样就能保证结果向量长度和Trial节点数完全匹配。
替代写法(tidyverse风格)
如果你习惯用purrr包,也可以这样写:
library(purrr) plouf_results <- map_chr(all_trials, ~{ plouf_node <- xml_find_first(.x, "./plouf") ifelse(is.na(plouf_node), NA_character_, xml_text(plouf_node)) })
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

