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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:02:07