在vc中使用MSXML解析xml文件


//WebClient.cpp:Definestheentrypointfortheconsoleapplication.
//


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

#import
<msxml4.dll>

voidupdateXML(CString,CString);
inlinevoidTESTHR(HRESULT_hr){ifFAILED(_hr)throw(_hr);}

voidmain(){
intport=4000;
//用于接受信息的buffer
charrecvBuf[100];
//name
CStringname;
//value
CStringvalue;

//初始化Socket编程环境
WORDwVersionRequested;
WSADATAwsaData;
interr;
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
SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);
//客户端地址
SOCKADDR_INaddrSrv;
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_INaddrServer;
intlen=sizeof(SOCKADDR_IN);

//MessageBox("clientstarts...");

//接受服务器端的请求socket
SOCKETsockConn=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);
}

//执行修改
voidupdateXML(CStringname,CStringvalue)
{
try{
MSXML2::IXMLDOMDocumentPtrdocPtr;
MSXML2::IXMLDOMElementPtrelmRoot;
/*
HRESULThr;
hr=docPtr.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if(FAILED(hr))
{
printf("无法创建DOMDocument对象,请检查是否安装了MSXMLParser运行库! ");
//MessageBox("无法创建DOMDocument对象,请检查是否安装了MSXMLParser运行库!");
return;
}*/

//init
TESTHR(CoInitialize(NULL));
TESTHR(docPtr.CreateInstance("msxml2.domdocument"));

CStringfilePath="c:\nfs.xml";

//加载xml文件
docPtr->load((_bstr_t)filePath);

//初始化DOM根结点元素
elmRoot=docPtr->selectSingleNode("SecurityFile");

//要查找的节点名称
CStringstrToLook="//usbDevice";
CStringstr_type_Name="type";
CStringstr_type_Value=name;//""移动存储设备"";
CStringstr_state_Name="State";
CStringstr_state_Value=value;//""disable"";

//用于保存找到的节点列表
MSXML2::IXMLDOMNodeListPtrlist;
list=docPtr->selectNodes((_bstr_t)strToLook);

longnumOfNode=list->length;
//对查找到的节点依次处理
MSXML2::IXMLDOMNodePtrtemp,tempChild,stateNode;
//每个节点的子节点列表
MSXML2::IXMLDOMNodeListPtrtempChildList;

boolflag=false;
for(inti=0;i
<numOfNode;i++){
list-
>get_item(i,&temp);
tempChildList=temp->childNodes;

for(intj=0;j
<tempChildList->length;j++){
tempChildList->get_item(j,
&tempChild);

CStringstrName=(char*)(_bstr_t)tempChild->nodeName;
CStringstrValue=(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)(constchar*)str_state_Value);
}else{
//MessageBox("没有找到匹配节点!");
printf("没有找到匹配节点!");
}

//保存变化到xml文件
docPtr->save((_bstr_t)filePath);
}catch(...){
//MessageBox("someerroroccer...");
printf("someerroroccer...");
}
}

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

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

更多技术文章请参看施昌权的个人网站: http://www.joyvc.cn

优质内容筛选与推荐>>
1、java开源框架的源代码怎么读?
2、Boost–progress_timer
3、OpenWrt挂载移动硬盘实现脱机下载
4、无缘无故QQ粉钻
5、KMP算法讲述网站


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号