VC读写XML文档

转载http://blog.sina.com.cn/s/blog_4b5039210100issi.html


实验环境:VC++6.0 ,windows XP   需要安装MSXML 4.0 SP2

     实现的功能是初始化XML文档,读取特定节点,和创建新节点删除节点等操作。XML文件如下所示:

 

VC读写XML文档(一)

    首先我们要实现的功能是:创建一个如图所示的XML文档

    在VC中创建基于对话框的MFC工程。主对话框实现下面的摆放。

VC读写XML文档(一)

    主要功能为:初始化XML文档,是初始化如第一幅图所示的XML,登陆即按照XML中的用户账号信息进行登陆,分为管理员身份和普通用户身份。

    程序刚运行时,已经有初始化的XML文档在程序文件夹下。此时只有登陆按钮可用。

管理员登陆以后:登陆按钮变为不可用,其他按钮均变为可用;(只有管理员有权初始化,创建和删除用户)。

    普通用户登陆以后:只有注销按钮可用,其余全为不可用。

    对话框各控件ID和关联变量如下图:

VC读写XML文档(一)


    在实现功能之前,需要做下面几步:

1.     StdAfx.h中引入动态链接库

MSXML.DLL(C:\windows\system32\msxml.dll)

#import <msxml4.dll>

2. APP类的InitInstance函数里面加入如下代码:
   AfxOleInit();  //Com
口初始化

3.在我们要操作XMLcpp文件开始部分加入:

   using namespace MSXML2;

4. 为了实现用户的权限控制,在Dlg类的OnInitDialog()函数中添加:

    //初始化只有登陆按钮可用

    GetDlgItem(IDC_CREATE)->EnableWindow(false);  

    GetDlgItem(IDC_DELETE)->EnableWindow(false);

    GetDlgItem(IDC_LOGOUT)->EnableWindow(false);

    GetDlgItem(IDC_INITIAL)->EnableWindow(false);


功能实现部分:

  初始化XML

在按钮初始化XML”的响应函数OnInitial_XML()里面加入下面的代码:

void CXML_DatabaseDlg::OnInitial_XML()

{

    // TODO: Add your control notification handler code here

    //创建XML文件

    UpdateData(TRUE);

    MSXML2::IXMLDOMDocumentPtr pDoc;

    MSXML2::IXMLDOMElementPtr xmlRoot;

//创建DOMDocument对象

    HRESULT hr = pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument40));

    if (FAILED(hr))

    {

        MessageBox("无法创建DOM文件对象,检查是否安装MS XML Parser运行库!");

        return;

    }

    //根节点名称为Account

    //创建元素并添加到文档中

    xmlRoot = pDoc->createElement_x((_bstr_t)"Account");

    pDoc->appendChild(xmlRoot);

    //创建一个节点

    MSXML2::IXMLDOMElementPtr pNode;

    //添加用户

    pNode = pDoc->createElement_x((_bstr_t)"USER");

    pNode->setAttribute("id","admin");

    pNode->setAttribute("password","admin");

    pNode->setAttribute("persimmon","admin");

    xmlRoot->appendChild(pNode);

    //添加用户

    pNode = pDoc->createElement_x((_bstr_t)"USER");

    pNode->setAttribute("id","monitor1");

    pNode->setAttribute("password","monitor1");

    pNode->setAttribute("persimmon","user");

    xmlRoot->appendChild(pNode);

    //添加用户

    pNode = pDoc->createElement_x((_bstr_t)"USER");

    pNode->setAttribute("id","monitor2");

    pNode->setAttribute("password","monitor2");

    pNode->setAttribute("persimmon","user");

    xmlRoot->appendChild(pNode);

    //保存文件,不存在就建立,存在就覆盖

    pDoc->save("account.xml");

    m_List.InsertString(-1,"XML初始化成功........");

}

 

  登陆(读取XML

首先要做一个登陆对话框,如下图所示:

VC读写XML文档(一)


然后登陆对话框的控件ID和关联变量如下图所示:

VC读写XML文档(一)

CXML_DatabaseDlg 中添加public变量: CLoginDlg logdlg;

给“登陆”按钮添加响应函数OnLogin()。添加如下代码:

void CXML_DatabaseDlg::OnLogin()

{

    // TODO: Add your control notification handler code here

    if(logdlg.DoModal()==IDOK)

    {

        CString username="",username_in="";   //用户名,密码

        CString password="",password_in="";

        CString permission="";

        //得到输入的用户名和密码

        username_in = logdlg.m_name;      

        password_in = logdlg.m_password;

        if (username_in==""||password_in=="")

        {

            MessageBox("用户名或者密码不能为空!");

            return;

        }

        MSXML2::IXMLDOMDocumentPtr pDoc;

        HRESULT hr;

        hr = pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument40));

        if (FAILED(hr))

        {

            MessageBox("无法创建DOM对象,检查是否安装了MS XML Parser运行库!");

            return;

        }

        //加载xml文档

        pDoc->load("account.xml");

//得到根节点

        MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetdocumentElement();    

        MSXML2::IXMLDOMNodeListPtr pNodeList =  pRoot->GetchildNodes();  

//得到所有的节点列表

MSXML2::IXMLDOMNamedNodeMapPtr pNodeAttributes;                   //某个节点所有的属性

        MSXML2::IXMLDOMNodePtr pNode,pid,ppassword,ppermission;

        //遍历所有USER节点

        long nodecount=0;

        pNodeList->get_length(&nodecount);

        _variant_t id_value,password_value,permission_value;

//存储节点属性值

        for (long i=0;i<nodecount;i++)

        {

            pNode = pNodeList->Getitem(i);

            pNodeAttributes = pNode->Getattributes();

 //得到每一个节点的所有属性

            //遍历一个节点的所有属性id,password,permission

            pid = pNodeAttributes->Getitem(0);

            id_value = pid->GetnodeValue();           

//得到这个节点的id属性值

            username = (char *)(_bstr_t)id_value;

            if (username==username_in)

            {

                ppassword = pNodeAttributes->Getitem(1); 

      //如果id匹配,接着比较password

                password_value = ppassword->GetnodeValue();

                password = (char *)(_bstr_t)password_value;

                if (password==password_in)

                {              

                   //id ,password都正确,得到用户权限

                    ppermission = pNodeAttributes->Getitem(2);

                    permission_value = ppermission->GetnodeValue();

                    permission = (char *)(_bstr_t)permission_value;

                    if (permission=="admin")

                    {

                        m_List.InsertString(-1,"管理员"+logdlg.m_name+"登陆成功......");

GetDlgItem(IDC_CREATE)->EnableWindow(true)

                         GetDlgItem(IDC_DELETE)->EnableWindow(true);

                             GetDlgItem(IDC_LOGIN)->EnableWindow(false);

GetDlgItem(IDC_LOGOUT)->EnableWindow(true);

                        return;

                    }

                    else

                    {

                        m_List.InsertString(-1,"普通用户"+logdlg.m_name+"登陆成功......");

GetDlgItem(IDC_LOGOUT)->EnableWindow(true);

                        return;

                    }      

                }

                else

                {

                    MessageBox("密码错误!");

                    return;

                }

            }

            else if(i==nodecount-1)

            {

                MessageBox("用户不存在");

                return;

            }

        }

    }  

}

  注销

注销主要做的就是使一些按钮不可用,如下所示:

给“注销”按钮添加响应函数 OnLogOut(),并添加如下代码:

void CXML_DatabaseDlg::OnLogout()

{

    // TODO: Add your control notification handler code here

    GetDlgItem(IDC_CREATE)->EnableWindow(false);

    GetDlgItem(IDC_DELETE)->EnableWindow(false);

    GetDlgItem(IDC_LOGIN)->EnableWindow(true);

    GetDlgItem(IDC_LOGOUT)->EnableWindow(false);

    GetDlgItem(IDC_INITIAL)->EnableWindow(false);

m_List.InsertString("用户"+logdlg.m_name+"成功注销!");

    logdlg.m_name="";

    logdlg.m_password="";

}

四  创建用户(添加XML节点)

    创建一个添加用户的对话框。类似于登陆对话框,各个控件如下,关联变量:

 

VC读写XML文档(三)



给创建用户按钮添加响应函数OnCreateUser();添加代码如下:

void CXML_DatabaseDlg::OnCreateUser()

{

    // TODO: Add your control notification handler code here

    CAddUserDlg adddlg;

    CString add_username,add_password,tmpStr="";

   

    if (adddlg.DoModal()==IDOK)

    {

        add_username=adddlg.m_newid;

        add_password=adddlg.m_newpassword;

        if(add_username==""||add_password=="")

        {

            MessageBox("用户名或密码不能为空!");

            return;

        }

        //判断用户名是否已存在

        MSXML2::IXMLDOMDocumentPtr pDoc;

        HRESULT hr;

        hr = pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument40));

        //加载xml文档

        pDoc->load("account.xml");

        //得到根节点

        MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetdocumentElement();

        //得到所有的节点列表

        MSXML2::IXMLDOMNodeListPtr pNodeList =  pRoot->GetchildNodes();  

        //某个节点所有的属性

        MSXML2::IXMLDOMNamedNodeMapPtr pNodeAttributes;              

        MSXML2::IXMLDOMNodePtr pNode,pid;

        //遍历所有USER节点

        long nodecount=0;

        pNodeList->get_length(&nodecount);

        _variant_t id_value; //存储节点id属性值

        for (long i=0;i<nodecount;i++)

        {

            pNode = pNodeList->Getitem(i);

            //得到每一个节点的所有属性

            pNodeAttributes = pNode->Getattributes();

            //遍历一个节点的所有属性id,password,permission

            pid = pNodeAttributes->Getitem(0);

            //得到这个节点的id属性值

            id_value = pid->GetnodeValue();           

            tmpStr = (char *)(_bstr_t)id_value;

            if (add_username==tmpStr)

            {

                //用户名已存在

                MessageBox("用户名已存在!");

                return;

            }

        }

        MSXML2::IXMLDOMElementPtr pNewnode = pDoc->createElement_x("USER");

        pNewnode->setAttribute("id",(const char*)add_username);

        pNewnode->setAttribute("password",(const char*)add_password);

        pNewnode->setAttribute("permission",(const char*)"user");

        pRoot->appendChild(pNewnode);

        pDoc->save("account.xml");

        m_List.InsertString(-1,"新用户"+add_username+"创建成功...");

        MessageBox("新用户"+add_username+"创建成功!");

    }

五  删除用户(删除XML节点)

    首先要创建一个删除用户的对话框,两个按钮,一个接受输入用户名的编辑框。各个控件和关联变量如下图所示:

 

VC读写XML文档(三)



给删除用户按钮添加响应函数OnDeleteUser(),添加代码:

void CXML_DatabaseDlg::OnDeleteUser()

{

    // TODO: Add your control notification handler code here

    CDeleteUserDlg deletedlg;

    CString tmpStr="",delete_username;

    if (deletedlg.DoModal()==IDOK)

    {

       delete_username=deletedlg.m_tobedelete;

        //判断用户名密码是否为空

        if (delete_username=="")

        {

            //用户名不能为空

            MessageBox("用户名不能为空!");

            return;

        }

        else if (delete_username==logdlg.m_name)

        {

            //无法删除当前登陆的用户

            MessageBox("不能删除管理员用户!");

            return;

        }

        //删除节点

        MSXML2::IXMLDOMDocumentPtr pDoc;

        HRESULT hr;

        hr = pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument40));

        //加载xml文档

        pDoc->load("account.xml");

        //得到根节点

        MSXML2::IXMLDOMElementPtr pRoot = pDoc->GetdocumentElement(); 

        //得到所有的节点列表

        MSXML2::IXMLDOMNodeListPtr pNodeList =  pRoot->GetchildNodes();

        //某个节点所有的属性

        MSXML2::IXMLDOMNamedNodeMapPtr pNodeAttributes;                  

        MSXML2::IXMLDOMNodePtr pNode,pid;

        //遍历所有USER节点

        long nodecount=0;

        pNodeList->get_length(&nodecount);

        _variant_t id_value; //存储节点id属性值

        for (long i=0;i<nodecount;i++)

        {

            pNode = pNodeList->Getitem(i);

            //得到每一个节点的所有属性

            pNodeAttributes = pNode->Getattributes(); 

            //遍历一个节点的所有属性id,password,permission

            pid = pNodeAttributes->Getitem(0);

            //得到这个节点的id属性值

            id_value = pid->GetnodeValue();           

            tmpStr = (char *)(_bstr_t)id_value;

            if (tmpStr==delete_username)

            {

                pRoot->removeChild(pNode);

                pDoc->save("account.xml");

                m_List.InsertString(-1,"用户"+delete_username+"已成功删除!");

                MessageBox("用户"+delete_username+"已成功删除!");

                return; //删除成功

            }

        }

    MessageBox("无法删除不存在的用户");

    }

}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值