简单的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();//调用读取的方法
}
posted @ 2009-07-09 13:19  colys  阅读(1038)  评论(0编辑  收藏  举报