在vc中使用MSXML解析xml文件
// WebClient.cpp : Defines the entry point for the console application.
 //
//


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

 #import <msxml4.dll>
#import <msxml4.dll> 

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

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

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

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

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

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

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

 //
//

 #include   "stdafx.h"
#include   "stdafx.h"    #include   <afx.h>
#include   <afx.h>    #include   <windows.h>
#include   <windows.h>    #pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "ws2_32.lib") #include "Winsock2.h"
#include "Winsock2.h"
 #import <msxml4.dll>
#import <msxml4.dll> 
 void updateXML(CString, CString);
void updateXML(CString, CString); inline void TESTHR( HRESULT _hr ) { if FAILED(_hr) throw(_hr); }
inline void TESTHR( HRESULT _hr ) { if FAILED(_hr) throw(_hr); }
 void main(){
void main(){ int port = 4000;
    int port = 4000; //用于接受信息的buffer
    //用于接受信息的buffer char recvBuf[100];
    char recvBuf[100]; //name
    //name CString name;
    CString name; //value
    //value  CString value;
    CString value; 
     //初始化Socket编程环境
    //初始化Socket编程环境 WORD wVersionRequested;
    WORD wVersionRequested; WSADATA wsaData;
    WSADATA wsaData; int err;
    int err; wVersionRequested = MAKEWORD(1,1);
    wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested, &wsaData);
    err = WSAStartup(wVersionRequested, &wsaData); if(err != 0){
    if(err != 0){ return;
        return; }
    } 
     if(LOBYTE(wsaData.wVersion) != 1 ||
    if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1){
        HIBYTE(wsaData.wVersion) != 1){ WSACleanup();
        WSACleanup(); return;
        return; }
    } 
     //创建TCP客户端socket
    //创建TCP客户端socket SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); //客户端地址
    //客户端地址 SOCKADDR_IN addrSrv;
    SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET;
    addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(port);
    addrSrv.sin_port = htons(port); 
     //将Socket与地址绑定在一起
    //将Socket与地址绑定在一起 bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
    bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR)); 
     //开始监听服务器的请求
    //开始监听服务器的请求 listen(sockSrv, 5);
    listen(sockSrv, 5); //用于存放服务器的地址
    //用于存放服务器的地址 SOCKADDR_IN addrServer;
    SOCKADDR_IN addrServer; int len = sizeof(SOCKADDR_IN);
    int len = sizeof(SOCKADDR_IN); 
     //MessageBox("client starts...");
    //MessageBox("client starts..."); 
     //接受服务器端的请求socket
    //接受服务器端的请求socket SOCKET sockConn = accept(sockSrv, (SOCKADDR *)&addrServer, &len);
    SOCKET sockConn = accept(sockSrv, (SOCKADDR *)&addrServer, &len); 
     //接受数据:要设置的属性
    //接受数据:要设置的属性 recv(sockConn, recvBuf, 100, 0);
    recv(sockConn, recvBuf, 100, 0); name = recvBuf;                            //""移动存储设备"";
    name = recvBuf;                            //""移动存储设备""; //MessageBox(name);
    //MessageBox(name);
 //接受数据:要设置的新值
    //接受数据:要设置的新值 recv(sockConn, recvBuf, 100, 0);
    recv(sockConn, recvBuf, 100, 0); value = recvBuf;                        //""enable"";
    value = recvBuf;                        //""enable""; //MessageBox(value);
    //MessageBox(value);
 //关闭socket
    //关闭socket closesocket(sockConn);
    closesocket(sockConn); 
     //清理socket环境
    //清理socket环境 WSACleanup();
    WSACleanup();     
     //更新xml文件
    //更新xml文件 updateXML(name, value);
    updateXML(name, value); 
     //显示成功修改
    //显示成功修改 //MessageBox("成功修改");
    //MessageBox("成功修改"); exit(0);
    exit(0); }
}
 //执行修改
//执行修改 void updateXML(CString name, CString value)
void updateXML(CString name, CString value) {
{ try{
    try{ MSXML2::IXMLDOMDocumentPtr docPtr;
        MSXML2::IXMLDOMDocumentPtr docPtr;  MSXML2::IXMLDOMElementPtr elmRoot;
        MSXML2::IXMLDOMElementPtr elmRoot; /*
        /* HRESULT    hr;
        HRESULT    hr; hr = docPtr.CreateInstance(__uuidof(MSXML2::DOMDocument40));
        hr = docPtr.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if(FAILED(hr))
        if(FAILED(hr)) {
        {   printf("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库! ");
            printf("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库! "); //MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
            //MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");  return ;
            return ; }*/
        }*/     
         //init
        //init TESTHR(CoInitialize(NULL));
        TESTHR(CoInitialize(NULL));  TESTHR(docPtr.CreateInstance("msxml2.domdocument"));
        TESTHR(docPtr.CreateInstance("msxml2.domdocument"));
 CString filePath = "c:\nfs.xml";
        CString filePath = "c:\nfs.xml"; 
         //加载xml文件
        //加载xml文件 docPtr->load((_bstr_t)filePath);
        docPtr->load((_bstr_t)filePath); 
         //初始化DOM根结点元素
        //初始化DOM根结点元素 elmRoot = docPtr->selectSingleNode("SecurityFile");
        elmRoot = docPtr->selectSingleNode("SecurityFile");          
         //要查找的节点名称
        //要查找的节点名称 CString strToLook = "//usbDevice";
        CString strToLook = "//usbDevice"; CString str_type_Name = "type";
        CString str_type_Name = "type"; CString str_type_Value = name;              // ""移动存储设备"";
        CString str_type_Value = name;              // ""移动存储设备""; CString str_state_Name = "State";
        CString str_state_Name = "State"; CString str_state_Value = value;            //""disable"";
        CString str_state_Value = value;            //""disable""; 
         //用于保存找到的节点列表
        //用于保存找到的节点列表 MSXML2::IXMLDOMNodeListPtr list;
        MSXML2::IXMLDOMNodeListPtr list; list = docPtr->selectNodes((_bstr_t)strToLook);
        list = docPtr->selectNodes((_bstr_t)strToLook); 
         long numOfNode = list->length;
        long numOfNode = list->length; //对查找到的节点依次处理
        //对查找到的节点依次处理 MSXML2::IXMLDOMNodePtr temp, tempChild, stateNode;
        MSXML2::IXMLDOMNodePtr temp, tempChild, stateNode; //每个节点的子节点列表
        //每个节点的子节点列表 MSXML2::IXMLDOMNodeListPtr tempChildList;
        MSXML2::IXMLDOMNodeListPtr tempChildList; 
         bool flag = false;
        bool flag = false; for(int i = 0; i < numOfNode; i++){
        for(int i = 0; i < numOfNode; i++){ list->get_item(i, &temp);
            list->get_item(i, &temp); tempChildList = temp->childNodes;
            tempChildList = temp->childNodes; 
             for(int j = 0; j < tempChildList->length; j++){
            for(int j = 0; j < tempChildList->length; j++){ tempChildList->get_item(j, &tempChild);
                tempChildList->get_item(j, &tempChild); 
                 CString strName = (char*)(_bstr_t)tempChild->nodeName;
                CString strName = (char*)(_bstr_t)tempChild->nodeName; CString strValue = (char*)(_bstr_t)tempChild->nodeTypedValue;
                CString strValue = (char*)(_bstr_t)tempChild->nodeTypedValue;                 
                 //MessageBox(strName + " " + strValue + ", " + name + " " + value);
                //MessageBox(strName + " " + strValue + ", " + name + " " + value);
 //如果找到,则记录State节点
                //如果找到,则记录State节点 if(flag && strName == str_state_Name){
                if(flag && strName == str_state_Name){ stateNode = tempChild;
                    stateNode = tempChild; break;
                    break; }
                } 
                 //找到type是"移动存储设备"的节点
                //找到type是"移动存储设备"的节点 if(strName == str_type_Name){
                if(strName == str_type_Name){ if(strValue == str_type_Value){
                    if(strValue == str_type_Value){ flag = true;
                        flag = true;         }
                    } }
                }                 }
            } }
        } 
         if(stateNode != NULL){
        if(stateNode != NULL){ stateNode->Puttext((_bstr_t)(const char *)str_state_Value);
            stateNode->Puttext((_bstr_t)(const char *)str_state_Value); }else{
        }else{ //MessageBox("没有找到匹配节点!");
            //MessageBox("没有找到匹配节点!"); printf("没有找到匹配节点!");
            printf("没有找到匹配节点!"); }
        } 
         //保存变化到xml文件
        //保存变化到xml文件 docPtr->save((_bstr_t)filePath);
        docPtr->save((_bstr_t)filePath);     }catch(...){
    }catch(...){ //MessageBox("some error occer...");
        //MessageBox("some error occer..."); printf("some error occer...");
        printf("some error occer..."); }
    } }
}
客户端接受一个要修改的属性,以及新值,修改xml文件。
这里要区分节点与属性的关系即可。
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号