准备
开发工具:VS2005,
前提:安装msxml6解析器,ms网站可下载
通过向导创建VC++ MFC 工程,基于对话框
添加引用:
//在StdAfx.h中引入动态链接库 MSXML.DLL(C:\windows\system32\msxml6.dll)
#import <msxml6.dll>
编辑资源,添加控件
在bookid对应的文本框右键,添加变量绑定(如下图,绑定控件值,变量名为:m_strId)
继续给另外两个文本框也绑定变量,分别为: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();//调用读取的方法 }