#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;
}