zoukankan      html  css  js  c++  java
  • 简单的XML文件读写

    准备

    开发工具:VS2005,

    前提:安装msxml6解析器,ms网站可下载

    通过向导创建VC++ MFC 工程,基于对话框

    添加引用:

    //在StdAfx.h中引入动态链接库 MSXML.DLL(C:\windows\system32\msxml6.dll)
    #import <msxml6.dll>

    编辑资源,添加控件

    image

    在bookid对应的文本框右键,添加变量绑定(如下图,绑定控件值,变量名为:m_strId)

    image

    继续给另外两个文本框也绑定变量,分别为:m_strAuthor,m_strTitle

    定义全局变量

    MSXML2::IXMLDOMDocumentPtr pDoc;//xml文档指针
    long bookIndex,bookCount ;//xml内容中,当前索引与book数量,用于显示”上一条记录”和”下一条记录”
    _bstr_t xmlfile;//xml文档路径

    注册事件

    双击各个按键,添加事件绑定

    写入xml方法:

    void CMFC2005Dlg::OnBnClickedButtonWritexml()
    {
        UpdateData();
        if (pDoc!=NULL) pDoc=NULL;
        //创建DOMDocument对象
        HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
        if(!SUCCEEDED(hr))
        {  
            MessageBox( _T("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"));
            return ;
        }
        MSXML2::IXMLDOMElementPtr xmlRoot ;
        //根节点的名称为Books
        xmlRoot=pDoc->createElement((_bstr_t)"Books");
        //创建个book节点
        for (int i=0;i<10;i++)
        {
            
            //创建book元素并添加到books中
            MSXML2::IXMLDOMElementPtr xmlBootNode ;
            xmlBootNode=pDoc->createElement((_bstr_t)"Book");
    
            //设置属性
            CString idvalue;
            idvalue.Format(_T("%s%d"), m_strId, i);
            xmlBootNode->setAttribute("id",(_bstr_t)idvalue);
            
            //下级结点
            MSXML2::IXMLDOMElementPtr pNode;
    
            //添加“author”元素
            CString authorValue ;
            authorValue.Format(_T("%s%d"),m_strAuthor,i);
            pNode=pDoc->createElement((_bstr_t)"Author");
            pNode->Puttext((_bstr_t)authorValue);
            xmlBootNode->appendChild(pNode);
    
            //添加“Title”元素
            CString titleValue ;
            titleValue.Format(_T("%s%d"),m_strTitle,i);
            pNode=pDoc->createElement("Title");
            pNode->Puttext((_bstr_t)titleValue);
            xmlBootNode->appendChild(pNode);
            xmlRoot->appendChild(xmlBootNode);
            pNode= NULL;
            xmlBootNode = NULL;
        }
        pDoc->appendChild(xmlRoot);
        //保存到文件,如果不存在就建立,存在就覆盖
        pDoc->save(xmlfile);    
    }

    读取xml方法:

    void CMFC2005Dlg::OnBnClickedButtonReadxml()
    {
        
        if (pDoc==NULL)
        {
            if( (_access( xmlfile, 0 )) == -1 )
            {
                MessageBox(_T("无法载入xml文件,请确定文件存在!"));
                return;
            }        
            HRESULT hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
            if(FAILED(hr))
            {  
                MessageBox(_T("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!"));
                return ;
            }        
            try
            {
                //加载文件
                pDoc->load(xmlfile);
            }
            catch (CFileException* e)
            {
                MessageBox(_T("无法载入xml文件,请确定文件存在并且允许访问!"));            
                pDoc = NULL;
                return ;
            }    
        }
        MSXML2::IXMLDOMNodeListPtr books = pDoc->GetdocumentElement()->GetchildNodes();    
         books->get_length( &bookCount) ;
        if(bookIndex >bookCount) 
        {
            if (bookIndex ==0) return;
            bookIndex =0;
        }
    
        MSXML2::IXMLDOMNodePtr   pNode;
        //查询第bookIndex个book节点
        pNode= books->Getitem(bookIndex);
        
        //节点属性,放在链表中
        MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap=NULL;
        MSXML2::IXMLDOMNodePtr    pAttrItem;
        _variant_t variantvalue;
        pNode->get_attributes(&pAttrMap);
        
        //获取id属性的值
        pAttrMap->get_item(0,&pAttrItem);
        m_strId =(LPTSTR) pAttrItem->Gettext();
        //取得author和title节点的值
        MSXML2::IXMLDOMNodeListPtr pNodeChildren= pNode->GetchildNodes();
         m_strAuthor = (LPTSTR) pNodeChildren->Getitem(0)->Gettext();
        m_strTitle = (LPTSTR) pNodeChildren->Getitem(1)->Gettext();
        UpdateData(FALSE);
        
    }

    上一条记录与下一条记录按钮的方法

    //上一条记录
    void CMFC2005Dlg::OnBnClickedButtonPrevbook()
    {
        if(bookCount < 1) return;
        if(bookIndex > 0) bookIndex --;
        else bookIndex = bookCount-1;
        OnBnClickedButtonReadxml();//调用读取的方法
    }
    
    //下一条记录
    void CMFC2005Dlg::OnBnClickedButtonNextbook()
    {
        if(bookCount < 1) return;
        if(bookIndex < bookCount - 1) bookIndex ++;
        else bookIndex = 0;
        OnBnClickedButtonReadxml();//调用读取的方法
    }
  • 相关阅读:
    arcgis 线转面
    CAD 命令
    一台服务器挂多个网站
    请教:gridview
    转折
    网站开发标准
    [导入]简单网站开发
    过年了!
    web.config的问题
    java 计算程序执行时间
  • 原文地址:https://www.cnblogs.com/colys/p/1519806.html
Copyright © 2011-2022 走看看