// OpXML.cpp : Defines the entry point for the console application.
//----------------------- Coded By Ronk --------------------------//
//----------------------- 2005-07-17 --------------------------//
#include "stdafx.h"
#include <stdio.h>
//---You must Setup the MSXML4.0 before using
#import <msxml4.dll>
using namespace MSXML2;
void xmlread(char *ch1,char *ch2,char *ch3);//Read the xmlstr and Get the Text of the Element
void xmlupdate(char *ch1,char *ch2,char *ch3);//Read the xmlstr and Update the Text of the Element
int main(int argc, char* argv[])
{
    char xmlstr[1024]="<inesmsg><msghead><version>LZD</version><root>ioio</root></msghead></inesmsg>";
    char strele[1024]="//version//";
    char textstr[1024]="NNYX";
    char value[1024];
    
    printf("The xmlstr is :\n%s\n\n",xmlstr);
    
    xmlread(xmlstr,strele,value); //befor Update
    printf("The Text of Element befor Update is: \n%s\n\n",value);
    
    xmlupdate(xmlstr,strele,textstr);//Change the Text of "<version>" with "NNYX"
    printf("The Updated xmlstr is :\n%s\n\n",xmlstr);
    
    xmlread(xmlstr,strele,value);//after Update
    printf("The Text of Element after Update is :\n%s\n\n",value);
    
    return 0;
}
void xmlread(char* msgstr,char* elestr,char *tex)
{
    //Initialize
    CoInitialize(NULL);
    
    IXMLDOMDocumentPtr pXmlDoc;
    IXMLDOMNodePtr pXmlNode;
    
    HRESULT hr;
    hr = pXmlDoc.CreateInstance(__uuidof(DOMDocument));
    if (FAILED(hr))
    {
        printf("Faild to Create XMLDom Instance !");
        pXmlDoc=NULL;
    }
    else
    {
        pXmlDoc ->async = VARIANT_FALSE;
        
        //Load xmlmsg
        _bstr_t xmlstr=(LPCSTR)msgstr;
        
        if (!(pXmlDoc->loadXML(msgstr)))
        {
            printf("Failed to Load xmlstr:\n%s\n",(LPCSTR)pXmlDoc->parseError->Getreason());
            pXmlDoc=NULL;
        }
        else
        {
            //Locate the Element
            _bstr_t str=(LPCSTR)elestr;
            pXmlNode = pXmlDoc ->selectSingleNode(elestr);
            
            if(FAILED(pXmlNode))
                printf("Faild to Locate the Element \n%s\n",str);
            else
            {
                //Read the Text of Element
                strcpy(tex,(LPCSTR)pXmlNode ->text);
                
                //Realese
                pXmlDoc.Release();
                pXmlNode.Release();
            }
        }
    }
}
void xmlupdate(char *msgstr,char *elestr,char *upstr)
{
    //---Initialize
    CoInitialize(NULL);
    
    IXMLDOMDocumentPtr pXmlDoc;
    IXMLDOMNodePtr pXmlNode;
    
    HRESULT hr;
    hr = pXmlDoc.CreateInstance(__uuidof(DOMDocument));
    if (FAILED(hr))
    {
        printf("Faild to Create XMLDom Instance !");
        pXmlDoc=NULL;
    }
    else
    {
        pXmlDoc ->async = VARIANT_FALSE;
        
        //Load xml str
        _bstr_t xmlstr=(LPCSTR)msgstr;
        
        if (!(pXmlDoc->loadXML(msgstr)))
        {
            printf("Failed to load xmlstr:\n%s\n",(LPCSTR)pXmlDoc->parseError->Getreason());
            pXmlDoc=NULL;
        }
        else
        {
            //Located the Element
            _bstr_t str=(LPCSTR)elestr;
            pXmlNode = pXmlDoc ->selectSingleNode(elestr);
            
            if (FAILED(pXmlNode))
                printf("Failed to Locate the Element \n%s\n",str);
            else
            {
                //Update the Text of the Element
                pXmlNode->text = upstr;
                
                //Get the New xmlstr
                strcpy(msgstr,(LPCSTR)pXmlDoc->xml);
                
                //Realese
                pXmlDoc.Release();
                pXmlNode.Release();
            }
        }
    }
}