【问题标题】:R xml2 : How to query only corresponding xml nodesR xml2:如何只查询对应的xml节点
【发布时间】:2021-10-22 23:58:00
【问题描述】:

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

不幸的是,当我尝试使用内置函数(例如来自 XML 包的 xmltodataframe 和来自 xmlconvert 包的 xml_to_df)转换文件时,我尝试过的所有 R 包(XML、flatxml、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 文件中,您可以看到 Charles 赚了 100 美元,Laura 一无所获(因为缺少条目,这是问题),Steve 赚了 200 美元。 p>

我想要 xml2 做的是,当查询名称和薪水节点时,当它找到一个名称但没有相应的薪水条目时返回一个“NA”(或零也可以),这样我就结束了像这样摆一张漂亮的桌子:

Name Salary
Charles 100
Laura NA
Steve 200

我知道我可以修改“xpath”以仅获取最后一个值(对于史蒂夫),这对我没有帮助,因为(在真实数据中)它也可能是第 100 或第 23 个人缺少工资信息。

[ 我知道工资号是作为字符值从 xml 文件中提取的。之后我会在列上进行变异(跨(薪水,as.double)。]

非常感谢任何帮助。非常感谢您。

【问题讨论】:

    标签: r xml xml2


    【解决方案1】:

    您需要更加小心地匹配姓名和薪水。基本上首先找到所有&lt;Name&gt; 节点,然后仅检查它们的下一个兄弟节点是否是&lt;Salary&gt; 节点。如果不是,则返回 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  
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多