'programming/C_C++'에 해당되는 글 279건

  1. 2017.07.21 libxml2 SMS REPORT 파싱

반응형

 

 


/*** 컴파일시 : -I/usr/include/libxml2 와 -lxml2 추가 **/


#include <libxml/parser.h>
#include <libxml/tree.h>


int XML_PARSING_SMS_Report(char *sRxSockMsg, int nRxSockMsgLen, char *sSessionKey, char *sResultCode)
{

    int nPktLen = 0;

    xmlDocPtr  doc;
    xmlNodePtr root_element;
    xmlNodePtr header_body_element;
    xmlNodePtr body_item_element;
    xmlNodePtr body_item_Detail_element;

    xmlChar *key;

    /*** nPktLen = strlen(sRxSockMsg); ***/
    nPktLen = nRxSockMsgLen;

    /* xml parser 초기화 */
    xmlInitParser();

    /* parse an XML in-memory block and build a tree */
    doc = xmlParseMemory(sRxSockMsg, nPktLen);

    if( doc == NULL ) {

        /* xml 라이브러리에 의해 할당된 메모리 정리 */

        xmlCleanupParser();

        fprintf(stdout, "xmlParseMemory doc is  is NULL\n");  fflush(stdout);

        return -1;

    }

    /* Get the root element node */
    root_element = xmlDocGetRootElement(doc);

    if( root_element == NULL ) {

        fprintf(stdout, "xmlDocGetRootElement is NULL\n");  fflush(stdout);

        /*free the document */
        xmlFreeDoc(doc);

        /* xml 라이브러리에 의해 할당된 메모리 정리 */
        xmlCleanupParser();

        return -1;

    }

     /* xml document의 root element의 이름 비교 */
    if(xmlStrcmp(root_element->name, (const xmlChar *) "Envelope")){

        fprintf(stdout, "RootElement Wrong Type. root node is not Envelope\n"); fflush(stdout);

        /*free the document */
        xmlFreeDoc(doc);

        /* xml 라이브러리에 의해 할당된 메모리 정리 */
        xmlCleanupParser();

        return -1;

    }

    /* root element의 child element 값을 가져옴 */
    header_body_element = root_element->xmlChildrenNode;

    /* 루프를 돌면서 element의 이름을 비교하여 해당 element를 찾음 */
    while(header_body_element != NULL){

        if((!xmlStrcmp(header_body_element->name, (const xmlChar *)"Body"))){

            body_item_element = header_body_element->xmlChildrenNode;

            /* 루프를 돌면서 element의 이름을 비교하여 해당 element를 찾음 */
            while(body_item_element != NULL){

                if((!xmlStrcmp(body_item_element->name, (const xmlChar *)"DeliveryReportReq"))) {

                    body_item_Detail_element = body_item_element->xmlChildrenNode;

                    /* 루프를 돌면서 element의 이름을 비교하여 해당 element를 찾음 */
                    while(body_item_Detail_element != NULL){

                        if((!xmlStrcmp(body_item_Detail_element->name, (const xmlChar *)"MessageID"))){

                            key = xmlNodeListGetString(doc, body_item_Detail_element->xmlChildrenNode, 1);

                            fprintf(stdout, "[Report] %s %s\n", body_item_Detail_element->name, key);  fflush(stdout);

                            memset(sSessionKey, 0x00, sizeof(sSessionKey));
                            sprintf(sSessionKey, "%.20s", key);

                            xmlFree(key);

                        }
                        else if((!xmlStrcmp(body_item_Detail_element->name, (const xmlChar *)"StatusCode"))){

                              key = xmlNodeListGetString(doc, body_item_Detail_element->xmlChildrenNode, 1);


                              fprintf(stdout, "[Report] %s %s\n", body_item_Detail_element->name, key);

                              memset(sResultCode, 0x00, sizeof(sResultCode));
                              sprintf(sResultCode, "%s", key);

                              xmlFree(key);
                        }

                        body_item_Detail_element = body_item_Detail_element->next;

                    } /* while문의 끝 */

                }/* if문의 끝 */

                body_item_element = body_item_element->next;

            }/* while문의 끝 */

        }/* if문의 끝 */

        header_body_element = header_body_element->next;

    }/* while문의 끝 */

    /*free the document */
    xmlFreeDoc(doc);

    /* xml 라이브러리에 의해 할당된 메모리 정리 */
    xmlCleanupParser();

    return 1;
}

 

 

반응형
Posted by 공간사랑
,