< - обновленный для полноты (благодаря 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")
Ваш пример не воспроизводимы. В отредактированном образце XML есть ошибки, и даже когда они исправлены, ваш первый фрагмент кода не дает результатов, которые вы показываете. – hrbrmstr
Спасибо, что ответили. Редактировал мою запись, надеюсь, что теперь это яснее. –
Прежде чем переходить с ответом XML, знаете ли вы о пакете [pubmed.mineR] (http://cran.r-project.org/web/packages/pubmed.mineR/)? – hrbrmstr