2010-11-23 47 views
0

我做了一個讀取RSS新聞訂閱源的程序。它不適用於某些網站,如(ABC News,TechCrunch,Engadget)。這些網站的體長超過一十萬。我使用XPATH方法進行解析。也許這個問題是由於我是巴達新人。我用於XML解析的代碼是bada中的XML解析失敗

void 
addfeed::OnTransactionReadyToRead(HttpSession& httpSession, HttpTransaction& httpTransaction, int availableBodyLen) 
{ 
    pFrame = Osp::App::Application::GetInstance()->GetAppFrame()->GetFrame(); 
    FormMgr* pFormMgr = dynamic_cast<FormMgr*> (pFrame->GetControl("FormMgr")); 
    bool flag1=0; 
    AppLog("####### OnTransactionReadyToRead! #######"); 

    HttpResponse* pHttpResponse = httpTransaction.GetResponse(); 
    if (pHttpResponse->GetStatusCode() == NET_HTTP_STATUS_OK) 
    { 
     AppLog("%d",availableBodyLen); 
     HttpHeader* pHttpHeader = pHttpResponse->GetHeader(); 

     String* tempHeaderString = pHttpHeader->GetRawHeaderN(); 

     ByteBuffer* pBuffer = pHttpResponse->ReadBodyN(); 

        String str((const char*)pBuffer->GetPointer()); 
     AppLog("Response: %s",str.GetPointer()); 

     int limit(pBuffer->GetLimit()); 
     AppLog("Limit: %d",limit); 

     xmlDoc * doc = NULL; 
        xmlXPathContextPtr xpathCtx; 
     xmlXPathObjectPtr xpathtitle; 
     xmlXPathObjectPtr descriptionObj; 
     xmlXPathObjectPtr linkObj; 
     xmlXPathObjectPtr pubdateObj; 

     doc = xmlParseMemory((const char*)pBuffer->GetPointer(),pBuffer->GetLimit());// Here itself my code fails 

     if(doc==NULL) 
     { 
      flag1=1; 
      AppLog("Failed to load xml doc!"); 
      xmlFreeDoc(doc); 
      xmlCleanupParser(); 
     } 
     else 
     { 
     AppLog("InTo XML Parsing"); 
     /* Create xpath evaluation context */ 
     xpathCtx = xmlXPathNewContext(doc); 
     if(xpathCtx == NULL) 
     { 
       AppLog("Error: unable to create new XPath context"); 
       xmlFreeDoc(doc); 
     } 

     /* Evaluate xpath expression */ 
     xpathtitle = xmlXPathEvalExpression((xmlChar*)"//item/title", xpathCtx); 
     if(xpathtitle == NULL) 
     { 
       AppLog("Error: unable to evaluate xpath expression"); 
       xmlXPathFreeContext(xpathCtx); 
       xmlFreeDoc(doc); 
     } 
     descriptionObj = xmlXPathEvalExpression((xmlChar*)"//item/description",xpathCtx); 
     if(descriptionObj == NULL) 
     { 
       AppLog("Error: unable to evaluate xpath expression"); 
       xmlXPathFreeContext(xpathCtx); 
       xmlFreeDoc(doc); 
     } 
     linkObj = xmlXPathEvalExpression((xmlChar*)"//item/link",xpathCtx); 
     if(linkObj==NULL) 
     { 
      AppLog("Error: unable to evaluate xpath expression"); 
      xmlXPathFreeContext(xpathCtx); 
      xmlFreeDoc(doc); 
     } 
     pubdateObj=xmlXPathEvalExpression((xmlChar*)"//item/pubDate",xpathCtx); 
     if(pubdateObj==NULL) 
     { 
      AppLog("Error: unable to evaluate xpath expression"); 
      xmlXPathFreeContext(xpathCtx); 
      xmlFreeDoc(doc); 
     } 
     get_xpath_titles1(xpathtitle->nodesetval); 
     get_xpath_description1(descriptionObj->nodesetval); 
     get_xpath_link1(linkObj->nodesetval); 
     get_xpath_pubdate1(pubdateObj->nodesetval); 

     xmlFreeDoc(doc); 
     xmlCleanupParser(); 

     delete tempHeaderString; 
     delete pBuffer; 
     } 
    } 
    else 
    { 
     flag1=1; 
    } 
    if(flag1==1) 
    { 
     pFormMgr->SendUserEvent(FormMgr::REQUEST_ID_ADD_FEED_FORM,null); 
    } 
} 
+0

仍然有問題? – 2011-02-11 14:14:00

+0

@Circadian:是的 – ArulRaj 2011-02-14 08:05:28

回答

2

我和你有同樣的問題。這不是一個解析問題,而是一個下載問題。

當下載大文件,你的情況大於一個十萬

OnTransactionReadyToRead 

被稱爲不止一次。

你需要做的是全解析代碼移到

OnTransactionCompleted 

被稱爲只有一次,文件下載完成時。

我也建議你先將xml保存到一個文件中。