R中具有分层节点,标签和值的xml解析器

Man*_*hah 1 xml r xml-parsing

我正在尝试从以下xml文件解析sample_attributes(最好是全部)。尝试了几件事,但XML陷入了一个节点:

xml.url <- "http://www.ebi.ac.uk/ena/data/view/ERS445758&display=xml"
xmlfile <- xmlTreeParse(xml.url)
xmltop = xmlRoot(xmlfile)
IBDcat <- xmlSApply(xmltop, function(x) xmlSApply(x, xmlValue))
Run Code Online (Sandbox Code Playgroud)

这里还提到了尝试过的解决方案: 如何将XML解析为R数据帧, 以及如何从xml文件创建R数据帧,但是当我尝试类似的操作时:

data <- xmlParse("http://www.ebi.ac.uk/ena/data/view/ERS445758&display=xml")
xml_data <- xmlToList(data)
xmlToDataFrame(nodes=getNodeSet(data,"/SAMPLE_ATTRIBUTE"))[c("age","sex","body site","body-mass index")]
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,指出未定义的列已选中

任何帮助将不胜感激,谢谢!

ali*_*ire 5

这是一个tidyverse选项;xml2具有read_xml具有关联as_list功能的简单功能。purrr是一个处理列表的程序包,非常方便,尽管您当然可以根据需要在base R中执行相同的操作。

library(xml2)
library(purrr)

x <- read_xml("http://www.ebi.ac.uk/ena/data/view/ERS445758&display=xml")

x_list <- as_list(x)

x_df <- x_list %>% map('SAMPLE_ATTRIBUTES') %>% flatten() %>% map_df(flatten)

x_df
#> # A tibble: 35 × 3
#>                       TAG                               VALUE UNITS
#>                     <chr>                               <chr> <chr>
#> 1      investigation type                          metagenome  <NA>
#> 2            project name                                BMRP  <NA>
#> 3     experimental factor                          microbiome  <NA>
#> 4             target gene                            16S rRNA  <NA>
#> 5      target subfragment                                V1V2  <NA>
#> 6             pcr primers                            27F-338R  <NA>
#> 7   multiplex identifiers                          TGATACGTCT  <NA>
#> 8       sequencing method                      pyrosequencing  <NA>
#> 9  sequence quality check                            software  <NA>
#> 10          chimera check ChimeraSlayer; Usearch 4.1 database  <NA>
#> # ... with 25 more rows
Run Code Online (Sandbox Code Playgroud)

或改为在XPath中进行子设置:

x %>% xml_find_all('//SAMPLE_ATTRIBUTE') %>% map(as_list) %>% map_df(flatten)
Run Code Online (Sandbox Code Playgroud)

返回相同的东西。