Используйте XPATH для получения значения из большого XML-файла NCBI - PullRequest
0 голосов
/ 18 марта 2019

Я новичок в R. Я скачал XML со всеми Биопроектами из NCBI.Размер файла составляет 1 ГБ.Я начал с этого:

setwd("C://Users/USER/Desktop/")
xmlfile = xmlParse("bioproject.xml")
root = xmlRoot(xmlfile)
xmlName(root)
[1] "PackageSet"
xmlSize(root)
[1] 357935

Итак, в NCBI 357935 проектов.Здесь я рассматриваю проект 34:

> root[[34]]
<Package>
  <Project>
    <Project>
      <ProjectID>
        <ArchiveID accession="PRJNA44" archive="NCBI" id="44"/>
      </ProjectID>
      <ProjectDescr>
        <Name>Bartonella quintana str. Toulouse</Name>
        <Title>Causes bacillary angiomatosis</Title>
        <Description>&lt;P&gt;&lt;B&gt;&lt;I&gt;Bartonella quintana&lt;/I&gt; str. Toulouse&lt;/B&gt;. &lt;I&gt;Bartonella quintana&lt;/I&gt; str. Toulouse was isolated from human blood in Toulouse, France in 1993. There is evidence of extensive genome reduction in comparison to other &lt;I&gt;Bartonella&lt;/I&gt; species which may be associated with the limited host range of &lt;I&gt;Bartonella quintana&lt;/I&gt;.</Description>
        <ExternalLink category="Other Databases" label="GOLD">
          <URL>http://genomesonline.org/cgi-bin/GOLD/bin/GOLDCards.cgi?goldstamp=Gc00191</URL>
        </ExternalLink>
        <Publication date="2004-06-24T00:00:00Z" id="15210978" status="ePublished">
          <Reference/>
          <DbType>ePubmed</DbType>
        </Publication>
        <ProjectReleaseDate>2004-06-25T00:00:00Z</ProjectReleaseDate>
        <LocusTagPrefix assembly_id="GCA_000046685" biosample_id="SAMEA3138248">BQ</LocusTagPrefix>
      </ProjectDescr>   
      <ProjectType>
        ...
        ...
      </ProjectType>
    </Project>
    <Submission submitted="2003-03-20">
      ...
      ...
    </Submission>
    <ProjectLinks>
      ...
      ...
    </ProjectLinks>
  </Project>
</Package>

Мне нужно получить ВСЕ значения <ProjectID> (в данном случае PRJNA44) во всем файле XML, ТОЛЬКО ЕСЛИ в <Description> в пределах<ProjectDescr> каждого проекта существует текст «изолированный от крови человека» (или «кровь», если это упрощает сценарий).В качестве альтернативы, если это упрощает задачу, вместо получения ProjectID я могу получить значение <URL> в пределах <ExternalLink в пределах <ProjectDescr>.

Я не знаю, как (или нужно ли) использоватьФункция xpath (или xpathApply, или getNodeSet, или xpathSApply).Спасибо за помощь.

1 Ответ

0 голосов
/ 18 марта 2019

Это довольно простые проблемы с множеством примеров.
Я считаю, что синтаксис пакета "xml2" проще в использовании, чем пакет "XML".

Пример над узлом проекта в качестве подузла для другого узла, помеченного как проект, это может вызвать проблемы при попытке выбора этого узла. Чтобы найти правильный узел, я проанализировал узел проекта как подузел проекта.

library(xml2)
library(dplyr)

#read xml document
page<-read_xml("bioproject.xml")

#find all of the project nodes
projectnodes<-xml_find_all(page, ".//Project/Project")

#loop through all of the nodes and extract the requested information
dfs<-lapply(projectnodes, function(node) {
   #find description text
   description<-xml_find_first(node, ".//Description") %>% xml_text()
   #find the URL link
   link<-xml_find_first(node, ".//URL") %>% xml_text()
   #find project ID 
   projid<-xml_find_first(node, ".//ArchiveID") %>% xml_attr("accession")
   #store data into individual data frames
   df<-data.frame(projid, link, description, stringsAsFactors = FALSE)
})  


#bind all of the rows together into a single final data frame
answer<-bind_rows(dfs)

#find rows with the keyword using regular expressions.
answer[grep("blood", answer$description),]
...