2015-06-10 2 views
0

< - обновленный для полноты (благодаря hrbrmstr для указания его) ->Sapply Остановка после первой инстанции при разборе XML

Я пытаюсь извлечь некоторые данные из Pubmed и я читал пример от here (соответствующая диаграмма here). отредактированная версия моих данных выглядит следующим образом:

<PubmedArticleSet> 
    <PubmedArticle> 
     <MedlineCitation Owner="NLM" Status="MEDLINE"> 
     <PMID Version="1">11841882</PMID> 
     <Article PubModel="Print"> 
      <PublicationTypeList> 
       <PublicationType UI="D002363">Case Reports</PublicationType> 
       <PublicationType UI="D016428">Journal Article</PublicationType> 
      </PublicationTypeList> 
     </Article> 
     <MeshHeadingList> 
      <MeshHeading> 
       <DescriptorName MajorTopicYN="N" UI="D016887">Cardiopulmonary Resuscitation</DescriptorName> 
      </MeshHeading> 
      <MeshHeading> 
       <DescriptorName MajorTopicYN="N" UI="D006323">Heart Arrest</DescriptorName> 
       <QualifierName MajorTopicYN="Y" UI="Q000188">drug therapy</QualifierName> 
       <QualifierName MajorTopicYN="N" UI="Q000401">mortality</QualifierName> 
       <QualifierName MajorTopicYN="N" UI="Q000628">therapy</QualifierName> 
      </MeshHeading> 
     </MeshHeadingList> 
     </MedlineCitation>  
    </PubmedArticle> 

    <PubmedArticle> 
     <MedlineCitation Owner="NLM" Status="MEDLINE"> 
     <PMID Version="1">11841881</PMID> 
     <Article PubModel="Print"> 
      <PublicationTypeList> 
       <PublicationType UI="D016428">Journal Article</PublicationType> 
      </PublicationTypeList> 
     </Article> 
     <MeshHeadingList> 
      <MeshHeading> 
       <DescriptorName MajorTopicYN="N" UI="D000368">Aged</DescriptorName> 
      </MeshHeading> 
      <MeshHeading> 
       <DescriptorName MajorTopicYN="N" UI="D016887">Cardiopulmonary Resuscitation</DescriptorName> 
      </MeshHeading> 
     </MeshHeadingList> 
    </MedlineCitation>  
    </PubmedArticle> 
</PubmedArticleSet> 

До сих пор я был в состоянии хорошо извлечь PublicationTypes используя следующий код (пожалуйста, запустить код в верхнем сегменте в конце этого поста первым):

utilAtype <- function(x){ 
     PMID <- xmlValue(x[[1]][[1]]) 
     PublicationType <- sapply(xmlChildren(x[["Article"]][["PublicationTypeList"]], omitNodeTypes = "XMLInternalTextNode"), xmlValue) 
     data.frame(PMID = PMID, PublicationType=PublicationType, stringsAsFactors = FALSE) 
} 

PMIDAType <- xpathApply(hdisease, '//MedlineCitation', utilAtype) 
PMIDAType <-do.call(rbind, PMIDAType) 

PMID PublicationType

11841882 Case Reports

11841882 журнала статья

11841881 журнал статья

Однако, используя подобный подход по результатам MeshHeadings в sapply пропуск остальных подузлов, как показано ниже:

PMID LName

11841882 Сердечно-легочная реанимация

-Другие записи для 11841182

недостает

11841881 престарелыми

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

require("XML") 
xmlfile=xmlParse("file.xml", useInternalNodes = TRUE) 
hdisease = xmlRoot(xmlfile) 

utilMesh <- function(x){ 
     PMID <- xmlValue(x[[1]][[1]]) 
     MHead <- ifelse(is.null(x[["MeshHeadingList"]]), NA, 
       sapply(xmlChildren(x[["MeshHeadingList"]], omitNodeTypes = "XMLInternalTextNode"), function(z) xmlValue(z[["DescriptorName"]]))) 
     data.frame(PMID = PMID, MHead=MHead, stringsAsFactors = FALSE) 
    } 

PMIDMesh <- xpathApply(hdisease, '//MedlineCitation', utilMesh) 
PMIDMesh<-do.call(rbind, PMIDMesh) 

c<-nrow(PMIDMesh) 
row.names(PMIDMesh) <- 1:c 
nrow(table(PMIDMesh)) 

write.csv(PMIDMesh,"Mesh1.csv") 
+0

Ваш пример не воспроизводимы. В отредактированном образце XML есть ошибки, и даже когда они исправлены, ваш первый фрагмент кода не дает результатов, которые вы показываете. – hrbrmstr

+0

Спасибо, что ответили. Редактировал мою запись, надеюсь, что теперь это яснее. –

+0

Прежде чем переходить с ответом XML, знаете ли вы о пакете [pubmed.mineR] (http://cran.r-project.org/web/packages/pubmed.mineR/)? – hrbrmstr

ответ

0

Я хотел бы использовать вместо XPath, может быть ...

library(rentrez) 
x <- entrez_fetch("pubmed", "xml", id=c(11841882,11841881)) 
doc <- xmlParse(x) 
pubs <- getNodeSet(doc, "//PubmedArticle") 

y <- lapply(pubs, function(x) data.frame(
    pmid = xpathSApply(x, ".//MedlineCitation/PMID", xmlValue), 
    mesh = xpathSApply(x, ".//MeshHeading/DescriptorName", xmlValue))) 

do.call("rbind", y) 

     pmid       mesh 
1 11841882 Cardiopulmonary Resuscitation 
2 11841882    Child, Preschool 
3 11841882      Female 
4 11841882     Heart Arrest 
5 11841882      Humans 
6 11841882      Infant 
7 11841882       Male 
8 11841882   Retrospective Studies 
9 11841882     Time Factors 
10 11841882  Vasoconstrictor Agents 
11 11841882     Vasopressins 
12 11841881       Aged 
13 11841881 Cardiopulmonary Resuscitation 
14 11841881   Electric Countershock 
15 11841881    Family Practice 
... 

 Смежные вопросы

  • Нет связанных вопросов^_^