在vc中使用MSXML解析xml文件

// WebClient.cpp : Defines the entry point for the console application.
//


#include   "stdafx.h"   
#include   
<afx.h>   
#include   
<windows.h>   
#pragma comment(lib, "ws2_32.lib")
#include "Winsock2.h"

#import 
<msxml4.dll> 

void updateXML(CString, CString);
inline void TESTHR( HRESULT _hr ) { if FAILED(_hr) throw(_hr); }

void main(){
    int port = 4000;
    //用于接受信息的buffer
    char recvBuf[100];
    //name
    CString name;
    //value 
    CString value;
    
    //初始化Socket编程环境
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;
    wVersionRequested = MAKEWORD(1,1);
    err = WSAStartup(wVersionRequested, 
&wsaData);
    if(err != 0){
        return;
    }
    
    if(LOBYTE(wsaData.wVersion) != 1 ||
        HIBYTE(wsaData.wVersion) != 1){
        WSACleanup();
        return;
    }
    
    //创建TCP客户端socket
    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
    //客户端地址
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(port);
    
    //将Socket与地址绑定在一起
    bind(sockSrv, (SOCKADDR *)
&addrSrv, sizeof(SOCKADDR));
    
    //开始监听服务器的请求
    listen(sockSrv, 5);
    //用于存放服务器的地址
    SOCKADDR_IN addrServer;
    int len = sizeof(SOCKADDR_IN);
    
    //MessageBox("client starts...");
    
    //接受服务器端的请求socket
    SOCKET sockConn = accept(sockSrv, (SOCKADDR *)
&addrServer&len);
    
    //接受数据:要设置的属性
    recv(sockConn, recvBuf, 100, 0);
    name = recvBuf;                            //""移动存储设备"";
    //MessageBox(name);

    //接受数据:要设置的新值
    recv(sockConn, recvBuf, 100, 0);
    value = recvBuf;                        //""enable"";
    //MessageBox(value);

    //关闭socket
    closesocket(sockConn);
    
    //清理socket环境
    WSACleanup();    
    
    //更新xml文件
    updateXML(name, value);
    
    //显示成功修改
    //MessageBox("成功修改");
    exit(0);
}

//执行修改
void updateXML(CString name, CString value)
{
    try{
        MSXML2::IXMLDOMDocumentPtr docPtr; 
        MSXML2::IXMLDOMElementPtr elmRoot;
        /*
        HRESULT    hr;
        hr = docPtr.CreateInstance(__uuidof(MSXML2::DOMDocument40));
        if(FAILED(hr))
        {  
            printf("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库! ");
            //MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"); 
            return ;
        }*/    
        
        //init
        TESTHR(CoInitialize(NULL)); 
        TESTHR(docPtr.CreateInstance("msxml2.domdocument"));

        CString filePath = "c:\nfs.xml";
        
        //加载xml文件
        docPtr->load((_bstr_t)filePath);
        
        //初始化DOM根结点元素
        elmRoot = docPtr->selectSingleNode("SecurityFile");         
        
        //要查找的节点名称
        CString strToLook = "//usbDevice";
        CString str_type_Name = "type";
        CString str_type_Value = name;              // ""移动存储设备"";
        CString str_state_Name = "State";
        CString str_state_Value = value;            //""disable"";
        
        //用于保存找到的节点列表
        MSXML2::IXMLDOMNodeListPtr list;
        list = docPtr->selectNodes((_bstr_t)strToLook);
        
        long numOfNode = list->length;
        //对查找到的节点依次处理
        MSXML2::IXMLDOMNodePtr temp, tempChild, stateNode;
        //每个节点的子节点列表
        MSXML2::IXMLDOMNodeListPtr tempChildList;
        
        bool flag = false;
        for(int i = 0; i 
< numOfNode; i++){
            list-
>get_item(i, &temp);
            tempChildList = temp->childNodes;
            
            for(int j = 0; j 
< tempChildList->length; j++){
                tempChildList->get_item(j, 
&tempChild);
                
                CString strName = (char*)(_bstr_t)tempChild->nodeName;
                CString strValue = (char*)(_bstr_t)tempChild->nodeTypedValue;                
                
                //MessageBox(strName + " " + strValue + ", " + name + " " + value);

                //如果找到,则记录State节点
                if(flag && strName == str_state_Name){
                    stateNode = tempChild;
                    break;
                }
                
                //找到type是"移动存储设备"的节点
                if(strName == str_type_Name){
                    if(strValue == str_type_Value){
                        flag = true;        
                    }
                }                
            }
        }
        
        if(stateNode != NULL){
            stateNode->Puttext((_bstr_t)(const char *)str_state_Value);
        }else{
            //MessageBox("没有找到匹配节点!");
            printf("没有找到匹配节点!");
        }
        
        //保存变化到xml文件
        docPtr->save((_bstr_t)filePath);    
    }catch(...){
        //MessageBox("some error occer...");
        printf("some error occer...");
    }
}

客户端接受一个要修改的属性,以及新值,修改xml文件。

这里要区分节点与属性的关系即可。

 

 

posted on 2008-02-21 18:08  施昌权-博客  阅读(1135)  评论(0编辑  收藏  举报

导航