Синтаксический анализ XML в bada - PullRequest
0 голосов
/ 23 ноября 2010

Я сделал программу, которая читает 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 Ответ

2 голосов
/ 14 февраля 2011

У меня была такая же проблема, как и у вас.Это не проблема синтаксического анализа, скорее проблема загрузки.

При загрузке больших файлов, в вашем случае, размер которых превышает один lakh

OnTransactionReadyToRead

вызывается более одного раза.

Что вам нужно сделать, это переместить весь код синтаксического анализа в

OnTransactionCompleted

, который вызывается только один раз, когда заканчивается загрузка файла.

Я бы также предложил сначала сохранить XMLв файл.

...