首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  NET/Web  |  XML   


在VC中使用MSXML解析xml文件


原作者:不详    源出处:不详    发布者:施昌权    发布类型:转载    发布日期:2008-08-30

 

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

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


关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号