在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文件。
这里要区分节点与属性的关系即可。