从R统计信息中的XML文件创建数据集

时间:2012-07-25 16:49:23

标签: r xml-parsing

我正在尝试下载期刊文章记录的XML文件并创建一个数据集,以便在R中进一步查询。我对XML完全不熟悉,而且在R中相当新手。我使用来自2个来源的代码拼凑了一些代码: GoogleScholarXScraperExtracting records from pubMed

library(RCurl)
library(XML)
library(stringr)

#Search terms
SearchString<-"cancer+small+cell+non+lung+survival+plastic"
mySearch<-str_c("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=",SearchString,"&usehistory=y",sep="",collapse=NULL)

#Seach
pub.esearch<-getURL(mySearch)

#Extract QueryKey and WebEnv
pub.esearch<-xmlTreeParse(pub.esearch,asText=TRUE)
key<-as.numeric(xmlValue(pub.esearch[["doc"]][["eSearchResult"]][["QueryKey"]]))
env<-xmlValue(pub.esearch[["doc"]][["eSearchResult"]][["WebEnv"]])

#Fetch Records
myFetch<-str_c("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&WebEnv=",env,"&retmode=xml&query_key=",key)
pub.efetch<-getURL(myFetch)
myxml<-xmlTreeParse(pub.efetch,asText=TRUE,useInternalNodes=TRUE)

#Create dataset of article characteristics #This doesn't work
pub.data<-NULL
pub.data<-data.frame(
  journal <- xpathSApply(myxml,"//PubmedArticle/MedlineCitation/MedlineJournalInfo/MedlineTA", xmlValue),
  abstract<- xpathSApply(myxml,"//PubmedArticle/MedlineCitation/Article/Abstract/AbstractText",xmlValue),
  affiliation<-xpathSApply(myxml,"//PubmedArticle/MedlineCitation/Article/Affiliation", xmlValue),
  year<-xpathSApply(myxml,"//PubmedArticle/MedlineCitation/Article/Journal/JournalIssue/PubDate/Year", xmlValue)
  ,stringsAsFactors=FALSE)

我似乎遇到的主要问题是我返回的XML文件没有完全统一的结构。例如,某些引用具有如下节点结构:

- <Abstract>
<AbstractText>The Wilms' tumor gene... </AbstractText>

虽然有些人有标签并且是这样的

- <Abstract>
<AbstractText Label="BACKGROUND &#38; AIMS" NlmCategory="OBJECTIVE">Some background text.</AbstractText>
<AbstractText Label="METHODS" NlmCategory="METHODS"> Some text on methods.</AbstractText>

当我提取'AbstactText'时,我希望能够获得24行数据(今天我运行这个搜索时有24条记录),但xpathSApply将'AbstactText'中的所有标签作为我的数据帧的单个元素返回。有没有办法在此实例中折叠XML结构/忽略标签?有没有办法让xpathSApply在路径​​末尾找不到任何东西时返回'NA'?我知道xmlToDataFrame,听起来应该适合这个账单,但每当我尝试使用它时,它似乎没有给我任何明智的东西。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我不确定你想要的是什么:

xpathSApply(myxml,"//*/AbstractText[@Label]")

将获得带有标签的节点(保留所有属性等)。

xpathSApply(myxml,"//*/AbstractText[not(@Label)]",xmlValue)

将获得没有标签的节点。

编辑:

test<-xpathApply(myxml,"//*/Abstract",xmlValue)

> length(test)
[1] 24

可能会给你你想要的东西

编辑:

获得联盟,年份等用NA填充

dumfun<-function(x,xstr){
res<-xpathSApply(x,xstr,xmlValue)
if(length(res)==0){
out<-NA
}else{
out<-res
}
out
}

xpathSApply(myxml,"//*/Article",dumfun,xstr='./Affiliation')
xpathSApply(myxml,"//*/Article",dumfun,xstr='./Journal/JournalIssue/PubDate/Year')