bada中的XML解析失败

时间:2010-11-23 04:31:34

标签: bada

我做了一个读取RSS新闻源的程序。它不适用于某些网站(ABC News,TechCrunch,Engadget)。这些网站的体长超过一万卢比。我使用XPATH方法进行解析。也许这个问题是由于我是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);
    }
}

1 个答案:

答案 0 :(得分:2)

我和你有同样的问题。它不是解析问题,而是下载问题。

下载大文件时,大小超过1万

OnTransactionReadyToRead

不止一次被召唤。

您需要做的是将整个解析代码移动到

OnTransactionCompleted

仅在文件下载完成时调用一次。

我还建议您先将xml保存到文件中。