#define XML_ROOT "<root/>" class CCMarkupTestDlg : public CDialog { ... public: afx_msg void OnBnClickedAdd(); afx_msg void OnBnClickedDelete(); afx_msg void OnBnClickedLoad(); afx_msg void OnBnClickedExport(); // 初始化xml文件导入 bool InitXmlLoad(CMarkup &xmlOpt, char* szFileName); // 格式化xml文件 bool InitXml(char* szFilePath); private: CString m_cstrClass; CString m_cstrCity; CString m_cstrSchool; CString m_cstrGroup; ... } // 格式化xml文件 bool CCMarkupTestDlg::InitXml(char* szFilePath) { CFile fXmlInit; if (FALSE == fXmlInit.Open(szFilePath, CFile::modeCreate | CFile::modeWrite)) { return false; } fXmlInit.Write(XML_ROOT, sizeof(XML_ROOT)); fXmlInit.Close(); return true; } bool CCMarkupTestDlg::InitXmlLoad(CMarkup &xmlOpt, char* szFileName) { // 是否成功加载 if (xmlOpt.Load(szFileName)) { // 是否是标准格式 if (xmlOpt.FindElem("root")) { return true; } // 是否格式化文件 else if (IDCANCEL == ::MessageBox(m_hWnd, "格式不正确是否格式化文件?", "提示", MB_OKCANCEL)) { return false; } } // // 如果文件不存在,创建文件 // else if (-1 == GetFileAttributes(szFileName)) // { // if (IDCANCEL == ::MessageBox(m_hWnd, "文件不存在,是否创建文件?", "提示", MB_OKCANCEL)) // { // return false; // } // // } // 创建并格式化文件 InitXml(szFileName); // 加载文件 if (!xmlOpt.Load(szFileName)) { return false; } xmlOpt.FindElem("root"); return true; } void CCMarkupTestDlg::OnBnClickedAdd() { // TODO: 在此添加控件通知处理程序代码 UpdateData(); if (m_cstrCity.IsEmpty() || m_cstrSchool.IsEmpty() || m_cstrClass.IsEmpty() || m_cstrGroup.IsEmpty()) { MessageBox("内容不能为空"); return; } CMarkup addXml; // 初始化CMarkup对象 if (!InitXmlLoad(addXml, szXmlLogPath)) { return; } // 添加city节点 addXml.AddChildElem("city"); addXml.IntoElem(); addXml.AddAttrib("name", m_cstrCity); // 添加school节点 addXml.AddChildElem("school"); addXml.IntoElem(); addXml.AddAttrib("name", m_cstrSchool); // 添加class节点 addXml.AddChildElem("class"); addXml.IntoElem(); addXml.AddAttrib("name", m_cstrClass); // 添加group节点 addXml.AddChildElem("group", m_cstrGroup); // 退出节点 addXml.OutOfElem(); addXml.OutOfElem(); addXml.OutOfElem(); // 保存 addXml.Save(szXmlLogPath); } void CCMarkupTestDlg::OnBnClickedDelete() { // TODO: 在此添加控件通知处理程序代码 UpdateData(); CMarkup readXml; // 加载不成功则退出 if (!readXml.Load(szXmlLogPath)) { return; } // 找到要删除的节点 while (readXml.FindChildElem("city")) { CString cstrXmlData; // 判断city节点 readXml.IntoElem(); cstrXmlData = readXml.GetAttrib("name"); if (cstrXmlData == m_cstrCity) { readXml.RemoveElem(); readXml.OutOfElem(); continue; } // 判断school节点 readXml.FindChildElem("school"); readXml.IntoElem(); cstrXmlData = readXml.GetAttrib("name"); if (cstrXmlData == m_cstrSchool) { // 回到city节点 readXml.OutOfElem(); readXml.RemoveElem(); continue; } // 判断class节点 readXml.FindChildElem("class"); readXml.IntoElem(); cstrXmlData = readXml.GetAttrib("name"); if (cstrXmlData == m_cstrClass) { // 回到city节点 readXml.OutOfElem(); readXml.OutOfElem(); readXml.RemoveElem(); readXml.OutOfElem(); continue; } // 判断group节点 readXml.FindChildElem("group"); cstrXmlData = readXml.GetChildData(); if (cstrXmlData == m_cstrGroup) { // 回到city节点 readXml.OutOfElem(); readXml.OutOfElem(); readXml.RemoveElem(); readXml.OutOfElem(); continue; } // 回到根节点 readXml.OutOfElem(); readXml.OutOfElem(); readXml.OutOfElem(); } readXml.Save(szXmlLogPath); } void CCMarkupTestDlg::OnBnClickedExport() { // TODO: 在此添加控件通知处理程序代码 CFileDialog loadDlg(TRUE, "xml"); loadDlg.m_pOFN->lpstrFilter = "xml Files(*.xml)/0*.xml/0All Files(*.*)/0*.*"; INT_PTR re = loadDlg.DoModal(); if (IDCANCEL == re) { return; } CMarkup xmlRead; CMarkup xmlWrite; // 获取文档完整路径 CString cstrPathName; cstrPathName = loadDlg.GetPathName(); if (!xmlRead.Load(cstrPathName)) { return; } if (!InitXmlLoad(xmlWrite, szXmlLoadPath)) { return; } // 添加root下节点 CString cstrGetDoc; while (xmlRead.FindChildElem("city")) { // 获取子节点 xmlRead.IntoElem(); cstrGetDoc += xmlRead.GetSubDoc(); xmlRead.OutOfElem(); } xmlWrite.IntoElem(); xmlWrite.AddSubDoc(cstrGetDoc); xmlWrite.Save(szXmlLoadPath); } xml文件格式: <root> <city name="南京"> <school name="1"> <class name="2"> <group>3</group> </class> </school> </city> </root>