在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文件。

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

你可能感兴趣的:(在vc中使用MSXML解析xml文件)