xml parse test

programming/C_C++ 2012. 12. 6. 19:52
반응형

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <malloc.h>
#include <iconv.h>

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

 

 

--------------------------------------------

 

libxml에서 encoding 처리 부분이 중요..

 

일부 장비에서는 메모리가 증가 하는 경우 있음..

 

utf8 만 처리 가능   "euc-kr" 처리시 문제가 되는 경우 있음.

 

==> 어느날 갑자기 메모리 증가 없이 정상 처리는 되었으나

      원인 파악이 되지 않아서 헤매고 있을때 도움을 주신 모든 분께 감사드립니다.

 

--------------------------------------------

 


int xml_test_func (char *sRecvMsg)
{
    int        nPktLen;

    xmlDocPtr  doc = NULL;
    xmlNodePtr root_element = NULL;
    xmlNodePtr header_body_element = NULL;
    xmlNodePtr body_item_element = NULL;
    xmlNodePtr body_item_Detail_element = NULL;
    xmlParserCtxtPtr ctxt = NULL;

    xmlChar *key;

    nPktLen = strlen(sRecvMsg);

    /* xml parser 초기화 */

#ifndef _DEF_MULTI_THREAD_

    xmlInitParser();

#else

    xmlParserCtxtPtr ctxt = xmlNewParserCtxt();

    xmlInitParserCtxt(ctxt);

#endif

    /* parse an XML in-memory block and build a tree */

#ifndef _DEF_MULTI_THREAD_

    doc = xmlParseMemory(sRecvMsg, nPktLen);

#else

    //doc = xmlCtxtReadMemory(ctxt, sRecvMsg, nPktLen, NULL, NULL, XML_PARSE_IGNORE_ENC);  /*** 인코딩 무시 ***/

    doc = xmlCtxtReadMemory(ctxt, sRecvMsg, nPktLen, NULL, NULL, 0);

#endif

    if( doc == NULL ) {

        fprintf(stderr,"xmlParseMemory/xmlCtxtReadMemory doc is NULL\n");

        /* free the document */

        if(ctxt) xmlFreeParserCtxt(ctxt);

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

        xmlCleanupParser();

        doc = NULL;

        return -1;
    }

    /* Get the root element node */

    root_element = xmlDocGetRootElement(doc);

    if( root_element == NULL ) {

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

        /*free the document */

        xmlFreeDoc(doc);

        if(ctxt) xmlFreeParserCtxt(ctxt);

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

        xmlCleanupParser();

        doc = NULL;

        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(stderr);

        /*free the document */

        xmlFreeDoc(doc);

        if(ctxt) xmlFreeParserCtxt(ctxt);

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

        xmlCleanupParser();

        doc = NULL;

        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){

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

                        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 라이브러리에 의해 할당된 메모리 정리 */
    if(ctxt) xmlFreeParserCtxt(ctxt);

    xmlCleanupParser();

    doc = NULL;

    return 1;

}

 

 

 

 

반응형
Posted by 공간사랑
,