将XML文件转换为R中的数据帧列表

将XML文件转换为R中的数据帧列表,r,xml,xpath,R,Xml,Xpath,我有一个来自唾液代谢物数据集。此数据是XML文件。我想做的是将这个XML文件转换为R中的数据帧列表,但是,我不想要列表中的所有节点 导入文件并转换为列表: require(XML) library("methods") data <- xmlParse("D:/rout/to/my/downloaded/file/saliva_metabolites/saliva_metabolites.xml") xml_data <- xmlToList

我有一个来自唾液代谢物数据集。此数据是XML文件。我想做的是将这个XML文件转换为R中的数据帧列表,但是,我不想要列表中的所有节点

导入文件并转换为列表:

require(XML)
library("methods")
data <- xmlParse("D:/rout/to/my/downloaded/file/saliva_metabolites/saliva_metabolites.xml")

xml_data <- xmlToList(data)

任何提示、参考或帮助都将不胜感激

不确定这是否是您要寻找的,但这里是前三个代谢物及其两个子节点的代码示例

library( xml2 )
library( magrittr )  #for pipe operator %>%

doc <- read_xml( "./temp/saliva_metabolites.xml" )
#get metabolite nodes (only first three used in this sample)
met.nodes <- xml_find_all( doc, ".//d1:metabolite" )[1:3]
#list of data.frames with secondary accessions
# only two in this sample
xpath_child.v <- c( "./d1:secondary_accessions/d1:accession",
                    "./d1:synonyms/d1:synonym" )
#what names should they get in the list?
child.names.v <- c( "secondary_accessions",
                    "synonyms" )
#first, loop over the met.nodes
L.sec_acc <- lapply( met.nodes, function(x) { 
  #second, loop over the xpath desired child-nodes
  temp <- lapply( xpath_child.v, function(y) { 
    xml_find_all(x, y ) %>% xml_text() %>% data.frame( value = .)
    })
  #set their names
  names(temp) = child.names.v
  return(temp)
  }) 
#set names of metabolites
names(L.sec_acc) <- xml_find_first( met.nodes, ".//d1:name ") %>% xml_text()

不确定这是否是您正在寻找的,但这里是前三个代谢物及其两个子节点的代码示例

library( xml2 )
library( magrittr )  #for pipe operator %>%

doc <- read_xml( "./temp/saliva_metabolites.xml" )
#get metabolite nodes (only first three used in this sample)
met.nodes <- xml_find_all( doc, ".//d1:metabolite" )[1:3]
#list of data.frames with secondary accessions
# only two in this sample
xpath_child.v <- c( "./d1:secondary_accessions/d1:accession",
                    "./d1:synonyms/d1:synonym" )
#what names should they get in the list?
child.names.v <- c( "secondary_accessions",
                    "synonyms" )
#first, loop over the met.nodes
L.sec_acc <- lapply( met.nodes, function(x) { 
  #second, loop over the xpath desired child-nodes
  temp <- lapply( xpath_child.v, function(y) { 
    xml_find_all(x, y ) %>% xml_text() %>% data.frame( value = .)
    })
  #set their names
  names(temp) = child.names.v
  return(temp)
  }) 
#set names of metabolites
names(L.sec_acc) <- xml_find_first( met.nodes, ".//d1:name ") %>% xml_text()
另一种选择:

### packages

library(XML)
library(data.table)
library(dplyr)

### xml parse

xml <- xmlTreeParse("C://Users/.../saliva_metabolites/saliva_metabolites.xml",useInternalNode=TRUE)

### get the context nodes

ns <- getNodeSet(xml, "//*[local-name()='metabolite']")

### rbind the results of a function which extracts the data in order to construct the df

df=rbindlist(lapply(ns, function(x) {
  nm = xpathSApply(x,"(.//*[local-name()='name'])[1]",xmlValue)
  acc = xpathSApply(x,"(.//*[local-name()='accession'])[1]",xmlValue)
  syn = xpathSApply(x,"(.//*[local-name()='synonyms'])[1]/*",xmlValue)
  data.frame(name=nm,accession=acc,synonyms = paste(syn, collapse = '¤'))}), fill=TRUE)

### put synonyms of each row in a list (not mandatory)

df$synonyms = lapply(strsplit(as.character(df$synonyms),split='¤'),trimws)

## adding NA where the result is blank for synonyms and export the dfs (1 for each metabolite)

outp = df %>% mutate(synonyms=na_if(synonyms, "")) %>% group_split(xml_pos=row_number())
软件包
库(XML)
库(数据表)
图书馆(dplyr)
###xml解析
xml%组分割(xml\u pos=row\u number())
输出(3个初步结果):

[[1]]
#一个tibble:1 x 4
名称登录同义词xml\u pos
1-甲基组氨酸HMDB0000001 1
[[2]]
#一个tibble:1 x 4
名称登录同义词xml\u pos
1 2-酮丁酸HMDB0000005 2
[[3]]
#一个tibble:1 x 4
名称登录同义词xml\u pos
1 2-羟基丁酸HMDB0000008 3
另一个选项:

### packages

library(XML)
library(data.table)
library(dplyr)

### xml parse

xml <- xmlTreeParse("C://Users/.../saliva_metabolites/saliva_metabolites.xml",useInternalNode=TRUE)

### get the context nodes

ns <- getNodeSet(xml, "//*[local-name()='metabolite']")

### rbind the results of a function which extracts the data in order to construct the df

df=rbindlist(lapply(ns, function(x) {
  nm = xpathSApply(x,"(.//*[local-name()='name'])[1]",xmlValue)
  acc = xpathSApply(x,"(.//*[local-name()='accession'])[1]",xmlValue)
  syn = xpathSApply(x,"(.//*[local-name()='synonyms'])[1]/*",xmlValue)
  data.frame(name=nm,accession=acc,synonyms = paste(syn, collapse = '¤'))}), fill=TRUE)

### put synonyms of each row in a list (not mandatory)

df$synonyms = lapply(strsplit(as.character(df$synonyms),split='¤'),trimws)

## adding NA where the result is blank for synonyms and export the dfs (1 for each metabolite)

outp = df %>% mutate(synonyms=na_if(synonyms, "")) %>% group_split(xml_pos=row_number())
软件包
库(XML)
库(数据表)
图书馆(dplyr)
###xml解析
xml%组分割(xml\u pos=row\u number())
输出(3个初步结果):

[[1]]
#一个tibble:1 x 4
名称登录同义词xml\u pos
1-甲基组氨酸HMDB0000001 1
[[2]]
#一个tibble:1 x 4
名称登录同义词xml\u pos
1 2-酮丁酸HMDB0000005 2
[[3]]
#一个tibble:1 x 4
名称登录同义词xml\u pos
1 2-羟基丁酸HMDB0000008 3

感谢您的努力!如果可以,我想询问有关子节点的信息。您提到了两个子节点,这就是我在代码中看到的:次要的访问和同义词。然而,它的输出看起来好像有一个或一个名字。为什么?我的第二个问题是关于语法,什么是“/d1:”?但是没有找到任何解释
/d1:
定义节点所在的xml命名空间。。看:不知道你用另一个名字是什么意思?代谢物本身的名称?看起来像是
路径
在节点
生物属性
内。。。您必须声明完整的路径,或使用
/
进行。看,例1和例2链接非常好,谢谢!我想再问一个问题,我正在尝试创建一个疾病名称列表(从节点diseases>disease>name),每个疾病将包含另一个包含所有pubmed_id值的列表(从节点diseases>disease>references>reference>pubmed_id),其中引用节点与代码中的名称节点处于同一级别,但不起作用。感谢您的努力!如果可以,我想询问有关子节点的信息。您提到了两个子节点,这就是我在代码中看到的:次要的访问和同义词。然而,它的输出看起来好像有一个或一个名字。为什么?我的第二个问题是关于语法,什么是“/d1:”?但是没有找到任何解释
/d1:
定义节点所在的xml命名空间。。看:不知道你用另一个名字是什么意思?代谢物本身的名称?看起来像是
路径
在节点
生物属性
内。。。您必须声明完整的路径,或使用
/
进行。看,例1和例2链接非常好,谢谢!我想再问一个问题,我正在尝试创建一个疾病名称列表(从节点diseases>disease>name),每个疾病将包含另一个包含所有pubmed_id值的列表(从节点diseases>disease>references>reference>pubmed_id),其中引用节点与代码中的名称节点处于同一级别,但不起作用。谢谢,E.Wiest!如果可以的话,我想问另一个问题。如果我想创建一个疾病名称列表(来自节点diseases>diseases>name),并且每个名称将包含一个pubmed\u id值列表((来自节点diseases>diseases>references>pubmed\u id)如果引用节点和名称节点是兄弟节点,是否可能?谢谢,E.Wiest!如果确定,我想问另一个问题。如果我想创建一个疾病名称列表(从节点疾病>疾病>名称),每个名称将包含一个pubmed_id值列表((从节点疾病>疾病>引用>pubmed_id)如果引用节点和名称节点是同级节点,是否可能?
### packages

library(XML)
library(data.table)
library(dplyr)

### xml parse

xml <- xmlTreeParse("C://Users/.../saliva_metabolites/saliva_metabolites.xml",useInternalNode=TRUE)

### get the context nodes

ns <- getNodeSet(xml, "//*[local-name()='metabolite']")

### rbind the results of a function which extracts the data in order to construct the df

df=rbindlist(lapply(ns, function(x) {
  nm = xpathSApply(x,"(.//*[local-name()='name'])[1]",xmlValue)
  acc = xpathSApply(x,"(.//*[local-name()='accession'])[1]",xmlValue)
  syn = xpathSApply(x,"(.//*[local-name()='synonyms'])[1]/*",xmlValue)
  data.frame(name=nm,accession=acc,synonyms = paste(syn, collapse = '¤'))}), fill=TRUE)

### put synonyms of each row in a list (not mandatory)

df$synonyms = lapply(strsplit(as.character(df$synonyms),split='¤'),trimws)

## adding NA where the result is blank for synonyms and export the dfs (1 for each metabolite)

outp = df %>% mutate(synonyms=na_if(synonyms, "")) %>% group_split(xml_pos=row_number())
[[1]]
# A tibble: 1 x 4
  name              accession   synonyms   xml_pos
  <chr>             <chr>       <list>       <int>
1 1-Methylhistidine HMDB0000001 <chr [13]>       1

[[2]]
# A tibble: 1 x 4
  name               accession   synonyms   xml_pos
  <chr>              <chr>       <list>       <int>
1 2-Ketobutyric acid HMDB0000005 <chr [43]>       2

[[3]]
# A tibble: 1 x 4
  name                  accession   synonyms   xml_pos
  <chr>                 <chr>       <list>       <int>
1 2-Hydroxybutyric acid HMDB0000008 <chr [37]>       3