R xml2:只查询对应的xml节点

  • 本文关键字:xml 节点 查询 xml2 r xml xml2
  • 更新时间 :
  • 英文 :


我正在尝试将许多XML文件读取并转换为R数据帧(或者最好是Tibbles)。

我尝试过的所有R包,不幸的是(XML, flatxml, xmlconvert)当我试图使用内置函数转换文件时失败了(例如xmltodataframe来自XML包和xml_to_df来自xmlconvert包),所以我必须用XML2手动完成。

下面是我的问题和一个小的工作例子:

# Minimal Working Example
library(tidyverse)
library(xml2)

interimxml <- read_xml("<Subdivision>
<Name>Charles</Name>
<Salary>100</Salary>
<Name>Laura</Name>
<Name>Steve</Name>
<Salary>200</Salary>
</Subdivision>")
names  <- xml_text(xml_find_all(interimxml ,"//Subdivision/Name"))
salary <- xml_text(xml_find_all(interimxml ,"//Subdivision/Salary"))
names
salary
# combine in to tibble (doesn't work because of inequal vector lengths)
result <- tibble(names=names, 
salary = salary)
result
rbind(names, salary)

从(编造的)XML文件中可以看到,查尔斯挣了100美元,劳拉什么也没挣(因为缺少条目,这就是问题所在),史蒂夫挣了200美元。

我想要xml2做的是,当查询姓名和工资节点是返回一个"NA"(或者零,这也可以),当它找到一个名称,但没有相应的工资条目时,这样我就会得到一个漂亮的表,像这样:

100NA200

您需要更加小心地匹配姓名和薪水。基本上首先找到所有的<Name>节点,然后只检查它们的下一个兄弟节点是否为<Salary>节点。如果不是,则返回NA。

nameNodes <- xml_find_all(interimxml ,"//Subdivision/Name")
names <- xml_text(nameNodes)
salary <- map_chr(nameNodes, ~xml_text(xml_find_first(., "./following-sibling::*[1][self::Salary]")))
tibble::tibble(names, salary)
#   names   salary
#   <chr>   <chr> 
# 1 Charles 100   
# 2 Laura   NA    
# 3 Steve   200  

相关内容

  • 没有找到相关文章

最新更新