2013-03-06 146 views
5

我试图自动从this government website的API下载一些数据。如何向API发送XML请求R

网站指示:

All requests for this version should be made to the following URL: 
http://api.finder.healthcare.gov/v2.0/ 

我可以找到大量的有关如何发送XML请求的信息,但没有一个例子是R特异性..并有大量的R代码里面,在那里,展示了如何使用XML,httrRCurl包,但我找不到在SO或r-help邮件列表中找到任何示例的实际发送 xml请求。 ..有更多文档解析响应。

the government website上,如果您单击PlansForIndividualOrFamily Samples示例,它将显示需要发送的xml请求(代码如下)。

url <- "http://api.finder.healthcare.gov/v2.0/" 

xml.request <- 
    "<?xml version='1.0' encoding='UTF-8'?> 
    <PrivateOptionsAPIRequest> 
     <PlansForIndividualOrFamilyRequest> 
      <Enrollees> 
       <Primary> 
        <DateOfBirth>1990-01-01</DateOfBirth> 
        <Gender>Male</Gender> 
        <TobaccoUser>Smoker</TobaccoUser> 
       </Primary> 
      </Enrollees> 
      <Location> 
       <ZipCode>69201</ZipCode> 
       <County> 
        <CountyName>CHERRY</CountyName> 
        <StateCode>NE</StateCode> 
       </County> 
      </Location> 
      <InsuranceEffectiveDate>2012-10-01</InsuranceEffectiveDate> 
     <IsFilterAnalysisRequiredIndicator>false</IsFilterAnalysisRequiredIndicator> 
     <PaginationInformation> 
      <PageNumber>1</PageNumber> 
      <PageSize>10</PageSize> 
     </PaginationInformation> 
     <SortOrder> 
      <SortField>OOP LIMIT - INDIVIDUAL - IN NETWORK</SortField> 
      <SortDirection>ASC</SortDirection> 
     </SortOrder> 
     <Filter/> 
     </PlansForIndividualOrFamilyRequest> 
    </PrivateOptionsAPIRequest>" 
+0

你碰巧知道如何发送XML请求到http://api.finder.healthcare.gov/v2.0/? – obautista 2013-11-22 04:22:31

回答

9

使用RCurl你这样做;

myheader=c(Connection="close", 
      'Content-Type' = "application/xml", 
      'Content-length' =nchar(xml.request)) 
data = getURL(url = url, 
        postfields=xml.request, 
        httpheader=myheader, 
        verbose=TRUE) 

就是这样。然后您可以使用XML包的xpathApply来检索数据。例如要获得家庭ID:

library(XML) 
xmltext <- xmlTreeParse(data, asText = TRUE,useInternalNodes=T) 
unlist(xpathApply(xmltext,'//Plan/PlanID',xmlValue)) ## change the right xpath here 

"29678NE0780012" "29678NE0780011" "29678NE0140010" 
    "29678NE0780010" "29678NE0140019" "29678NE0140018" "29678NE0140017" 
    "29678NE0140016" "29678NE0780005" "29678NE0780004" 
+1

壮丽。谢谢 :) – 2013-03-06 07:56:51