简单的XML文件读写 (转)

来源:互联网 发布:java程序培训班哪个好 编辑:程序博客网 时间:2024/06/05 08:22

准备

开发工具: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();//调用读取的方法}

http://www.cnblogs.com/colys/archive/2009/07/09/1519806.html