前言:
转载请附上连接,本帖原创请勿照抄。
这个多年以来有好多封装好的开源库可以供大家来使用,提高了大家工作效率也减轻了大家掉头发的速度,但是在日常工作中没找对方法和头绪的话是不是照样得掉头发。
在这里先推荐几个常用的库:tinyxml2 C++格式https://www.cnblogs.com/dengxiaojun/p/4439443.html 有参考示例、Libxml2 https://blog.csdn.net/helonSY/article/details/7236642?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-4-7236642.nonecase 有参考示例、tinyxml https://blog.csdn.net/u014080185/article/details/78688328?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-13-78688328.nonecase 有参考示例。还有好多好多的XML库在这里就不一一举栗了,既然库这么多作者是用的哪种库呢?我上面的库都没用过也没自己试过😂
作者使用的库叫做CMarkup 为什么用它呢?因为我觉得它对于我来说挺简单的(学都学了大半天不用它难道还要去在学一个库?),它支持C++、VC++,方便理解,有些库需要引入DLL添加路径什么的有点费事,这个库将.cpp和.h文件引入项目就可以了。
CMarkup库有两个文件一个Markup.cpp文件一个和Markup.h源文件(源代码都有了我感觉我也可以改一个XML开源库出来😂),项目原型图(读取ini界面改过来的所以有些类似),读取ini文章地址https://blog.csdn.net/qq_37529913/article/details/103764736
引入Markup库先实现添加XML字段功能
//Markup库头文件
#include "Markup.h"
//BUT1函数 MFC界面查询按钮
void CMFCTestIniDlg::OnBnClickedButton1()
{
CFileFind finder;
CString IniFile = "";
GetDlgItem(IDC_EDIT1)->GetWindowText(IniFile);
//查找是否存在ini文件,若不存在的话弹出提示
BOOL ifFind = finder.FindFile(IniFile);
if (!ifFind)
{
AfxMessageBox("没有该文件");
return;
}
CString str;
SetDlgItemText(IDC_EDIT2, str);
SetDlgItemText(IDC_EDIT3, str);
SetDlgItemText(IDC_EDIT4, str);
SetDlgItemText(IDC_EDIT5, str);
//创建XML文件
Add_XML();
//Open_XML(IniFile);
//Update_XML(IniFile);
//------Delete_XML(IniFile);
}
void CMFCTestIniDlg::Add_XML() {
CString strName = "https://blog.csdn.net/qq_37529913", strPatrolName = "断点_Dream2017", strTime = "2020.6.19";
CMarkup xml_Path;
//使用CMarkup可以声明也可以不声明
xml_Path.SetDoc("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");//双引号需要转义
//添加一个xml对象
xml_Path.AddElem(_T("LEADMAP"));
//进入根元素
xml_Path.IntoElem();
//进去指针指向的当前标签
xml_Path.AddElem(_T("ROUTE"));
//添加一个标签
xml_Path.SetAttrib(_T("user_name"), strName);
//对指针指向标签添加属性
xml_Path.SetAttrib(_T("route_name"), strPatrolName);
xml_Path.SetAttrib(_T("start_time"), strTime);
xml_Path.AddElem("Math");//添加Math元素
xml_Path.IntoElem();//进入Math元素
xml_Path.AddElem("Advanced_Mathematics", "classroom No.1");
xml_Path.AddElem("Mathematical_Analysis", "classroom No.2");
xml_Path.AddElem("Linear_Algebra", "classroom No.3");
xml_Path.AddElem("Probability_Theory", "classroom No.4");
xml_Path.OutOfElem();//退出Math元素
xml_Path.AddElem("English");//添加English元素
xml_Path.AddElem("Student", "Xiao_Ming");//添加内容为Xiao_Ming的Student元素
xml_Path.AddElem("Student", "Li_Hua");//添加内容为Li_Hua的Student元素
//退出根元素
xml_Path.OutOfElem();
//保存文件
xml_Path.Save(_T("test.xml"));
}
因为编辑框不能为空所以新建了一个aa.ini,然后点击查询调用创建XML函数创建XML文件。
实现查询XML字段功能
void CMFCTestIniDlg::OnBnClickedButton1()
{
CFileFind finder;
CString IniFile = "";
GetDlgItem(IDC_EDIT1)->GetWindowText(IniFile);
//查找是否存在ini文件,若不存在的话弹出提示
BOOL ifFind = finder.FindFile(IniFile);
if (!ifFind)
{
AfxMessageBox("没有该文件");
return;
}
CString str;
SetDlgItemText(IDC_EDIT2, str);
SetDlgItemText(IDC_EDIT3, str);
SetDlgItemText(IDC_EDIT4, str);
SetDlgItemText(IDC_EDIT5, str);
//Add_XML();
Open_XML(IniFile);
//Update_XML(IniFile);
//------Delete_XML(IniFile);
}
void CMFCTestIniDlg::Open_XML(CString file) {
CMarkup xmlInfo;
CString strTagName;//元素名称
CString strData;//元素内容
if (!(xmlInfo.Load(file)))
{
MessageBox(NULL, _T("请检查xml文件"));
}
xmlInfo.ResetMainPos();//把xml对象指向的位置初始化,使其指向文件开始
xmlInfo.FindElem(); //查找任意元素,此处查找到的第一个元素即为根元素
xmlInfo.IntoElem();//进入Root
while (xmlInfo.FindElem("Student"))//不能使用if,因为要遍历所有的Student元素
{
strTagName = xmlInfo.GetTagName();//获取元素名称
strData = xmlInfo.GetData();获取元素内容
AfxMessageBox(strTagName + " " + strData);
}
}
实现修改XML字段功能
void CMFCTestIniDlg::Update_XML(CString file) {
CMarkup xml;
if (!(xml.Load(file)))
{
MessageBox(NULL, _T("请检查xml文件"));
}
CString strUserID = _T("");
xml.ResetMainPos();
if (xml.FindChildElem("Math"))
{
xml.IntoElem();
if (xml.FindChildElem("Advanced_Mathematics"))
{
xml.IntoElem();
CString str_type = xml.GetAttrib("type");
MessageBox(str_type);
xml.SetAttrib("type", "change");
strUserID = xml.GetData();
xml.OutOfElem();
}
if (xml.FindChildElem("Probability_Theory"))
{
xml.IntoElem();
xml.SetData("classroom No.5");
xml.Save(file);
return;
}
}
}
实现删除XML字段功能
void CMFCTestIniDlg::Delete_XML(CString file) {
CMarkup xml;
if (!(xml.Load(file)))
{
MessageBox(NULL, _T("请检查xml文件"));
return;
}
CString strUserID = _T("");
xml.ResetMainPos();
if (xml.FindChildElem("ROUTE"))
{
xml.IntoElem();
xml.RemoveElem();
xml.Save(file);
}
}
基本上XML也就告一段落了,之前一直以为一周可以写两篇博客没想到最后变成了一月写两次博客...
最后给大家分享一些关于Markup库的文章:
https://www.cnblogs.com/lovelyx/p/4867109.html
https://blog.csdn.net/hanijiang/article/details/104225371 API说明
https://blog.csdn.net/xuelabizp/article/details/49055371 文章写的很好
完整Demo下载连接:https://download.csdn.net/download/qq_37529913/12620124