您的位置:首页 > 其它

在vc中使用MSXML解析xml文件

2008-02-21 18:08 716 查看
// 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文件。

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

更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: