我正在尝试将许多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"(或者零,这也可以),当它找到一个名称,但没有相应的工资条目时,这样我就会得到一个漂亮的表,像这样:
您需要更加小心地匹配姓名和薪水。基本上首先找到所有的<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