/*** 컴파일시 : -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;
}