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

R xml2查询对应XML节点时为缺失值填充NA生成数据框的方法

解决方案

核心思路

  • 不要单独提取所有<Name>和<Salary>节点,否则会丢失节点间的顺序对应关系
  • 按原XML的节点顺序遍历所有子节点,碰到<Name>就缓存当前人名,碰到<Salary>就和最近缓存的<Name>配对,未配对到<Salary>的<Name>默认赋值NA

完整可运行代码

library(tidyverse)
library(xml2)

# 示例XML
interimxml <- read_xml("<Subdivision>
              <Name>Charles</Name>
              <Salary>100</Salary>
              <Name>Laura</Name>
              <Name>Steve</Name>
              <Salary>200</Salary>
              </Subdivision>")

# 按顺序获取根节点下所有子节点
all_child_nodes <- xml_children(interimxml)
current_name <- NULL
res <- list()

for (node in all_child_nodes) {
  node_type <- xml_name(node)
  if (node_type == "Name") {
    # 上一个Name还没配对Salary,先存为NA
    if (!is.null(current_name)) {
      res <- append(res, list(tibble(Name = current_name, Salary = NA_character_)))
    }
    # 缓存当前新Name
    current_name <- xml_text(node)
  } else if (node_type == "Salary") {
    # 和当前缓存的Name配对
    res <- append(res, list(tibble(Name = current_name, Salary = xml_text(node))))
    current_name <- NULL
  }
}

# 处理最后一个未配对的Name
if (!is.null(current_name)) {
  res <- append(res, list(tibble(Name = current_name, Salary = NA_character_)))
}

# 合并为最终tibble,可按需转数值类型
final_tbl <- bind_rows(res) %>% 
  mutate(Salary = as.double(Salary))

# 查看结果
final_tbl

运行结果

# A tibble: 3 × 2
  Name    Salary
  <chr>    <dbl>
1 Charles    100
2 Laura       NA
3 Steve      200

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:06:03