MFC课程设计以及对xm文件的操作

原创 2016年08月31日 16:42:40

废话不说,进入正题,为了简便请调整项目属性为使用多字节字符集

tinyxml文件下载地址,(操作xml文件的)

http://sourceforge.net/projects/tinyxml/(如无法下载微信找我)

一些函数功能

ValueStr     //返回元素名称
SetValue     //设置元素名称
Parent     //返回父节点对象

FirstChild    //返回第一个子节点
LastChild     //返回最后一个子节点
IterateChildren   //返回下一个子节点

InsertEndChild   //在最后一个子节点后插入子节点
InsertBeforeChild   //在指定的子节点前插入子节点
InsertAfterChild   //在指定的子节点后插入子节点
ReplaceChild    //替换指定的子节点
RemoveChild    //删除指定的子节点
Clear     //删除所有的子节点

PreviousSibling   //返回同级中前一个节点
NextSibling    //返回同级中后一个节点

NextSiblingElement   //返回同级中后一个元素
FirstChildElement   //返回第一个子元素节点
Attribute     //返回元素中的属性值
QueryValueAttribute //返回元素中的属性值
SetAttribute    //设置元素中的属性值
FirstAttribute   //返回元素中第一个属性对象
LastAttribute    //返回元素中最后一个属性对象
RemoveAttribute   //删除元素中指定的属性对象

tinyxml的添加

首先,将下载的文件解压复制到原项目目录,

然后,在解决方案中头文件添加现有项,添加进去。


接下来,在stdafx.h中包含两个头文件。



mfc中xml文件的使用


第一步:建立对话框,添加CString变量(与编辑框关联起来).


第二步,(信息录入)添加按钮处理消息(双击按钮即可),利用UpdataeData()更新数据,将数据录入xml文件。

TiXmlDocument *pDoc = new TiXmlDocument();//文件指针
	const char *FileName = "res\\Number.xml";//文件名
	if(!pDoc->LoadFile(FileName))
	{
		UpdateData(TRUE);
		TiXmlElement *RootElement = NULL;//根节点
		TiXmlElement *PersonElement = NULL;//子节点

		TiXmlDeclaration *pTd = new TiXmlDeclaration("1.0", "gb2312", "yes" );
		pDoc->LinkEndChild(pTd);

		RootElement = new TiXmlElement("账号数据");
		pDoc->LinkEndChild(RootElement);
         }
         else{
                RootElement = pDoc->RootElement();
              }

		PersonElement = new TiXmlElement("用户");
		RootElement->LinkEndChild(PersonElement);

		TiXmlElement *NameElement = new TiXmlElement("账号");
		PersonElement->LinkEndChild(NameElement);
		TiXmlText *Number = new TiXmlText([要存的数据]);//存的数据可为CString类型
		NameElement->LinkEndChild(Number);

		TiXmlElement *PassWordElement = new TiXmlElement("密码");
		PersonElement->LinkEndChild(PassWordElement);
		TiXmlText *PassWord = new TiXmlText([要存的数据]);//存的数据可为CString类型
		PassWordElement->LinkEndChild(PassWord);
                
                //你有几项就弄几段上面的代码,本例为两项数据
                pDoc->SaveFile(FileName);
效果如下



第二步,(信息显示)先添加list control 控件,选择report(报表)属性,同时添加变量m_ctllist1选择control类型(默认)。

然后在OnInitDialog(void)函数中添加如下代码

DWORD dwStyle = m_ctllist1.GetExtendedStyle();                    //添加列表框的网格线!!!

	dwStyle |= LVS_EX_FULLROWSELECT;            
	dwStyle |= LVS_EX_GRIDLINES;                
	m_ctllist1.SetExtendedStyle(dwStyle);
	//list control 的初始化
	m_ctllist1.InsertColumn(0,"车牌",LVCFMT_CENTER,80); 
	m_ctllist1.InsertColumn(1,"进入时间",LVCFMT_CENTER,120);
	m_ctllist1.InsertColumn(2,"停车时间",LVCFMT_CENTER,120); 
	m_ctllist1.InsertColumn(3,"应缴费用",LVCFMT_CENTER,100);
	m_ctllist1.InsertColumn(4,"备注",LVCFMT_CENTER,220);
数值为长度,如未发现此函数,请在类向导中虚函数添加该函数。运行效果如下


然后添加刷新按钮事件处理程序

TiXmlDocument * myDocument = new TiXmlDocument(); 
	if (!myDocument->LoadFile("res\\Number.xml"))
	{
		return ;
	}
	TiXmlElement *RootElement = myDocument->RootElement(); 

	TiXmlElement *FirstElement = RootElement->FirstChildElement();

	//循环遍历
	for (int i=0;FirstElement;i++)
	{
		TiXmlElement *NameElement = FirstElement->FirstChildElement();
		m_ctllist1.InsertItem(i,NameElement->GetText());//设置列表框第0行第0列数据

		//显示进车时间
		TiXmlElement *DateElement = NameElement->NextSiblingElement();
		const char *temp = DateElement-><pre name="code" class="html">GetText()
;m_ctllist1.SetItemText(i,1,temp);//设置列表框第0行第1列数据FirstElement = FirstElement->NextSiblingElement();}


第三步,(信息查找及修改)添加查找对话框,编辑框添加变量,本例为m_Number 。查找代码如下

const char *FileNmae = "res\\Number.xml";
	TiXmlDocument *pDoc = new TiXmlDocument();
	if (pDoc->LoadFile(FileNmae))
	{
		TiXmlElement *RootElement = pDoc->RootElement();
		TiXmlElement *SonElement = RootElement->FirstChildElement();
		TiXmlElement *NumberElement = NULL;
		TiXmlElement *passWordElement = NULL;
		while (SonElement)
		{
			NumberElement = SonElement->FirstChildElement();
			if (NumberElement->GetText() == m_Number)//查找成功判断之后
			{

			}
			SonElement=SonElement->NextSiblingElement();
		}
信息查找修改代码如下,本例为查找用户名为m_Number修改密码为m_PassWord.两个变量都为编辑框CString类型

const char *FileNmae = "res\\Number.xml";
	TiXmlDocument *pDoc = new TiXmlDocument();
	if (pDoc->LoadFile(FileNmae))
	{
		TiXmlElement *RootElement = pDoc->RootElement();
		TiXmlElement *SonElement = RootElement->FirstChildElement();
		TiXmlElement *NumberElement = NULL;
		TiXmlElement *passWordElement = NULL;
		while (SonElement)
		{
			NumberElement = SonElement->FirstChildElement();
			if (NumberElement->GetText() == m_Number)
			{
				if (IDYES == MessageBox("该账号已存在,继续操作将覆盖","是否继续?",MB_YESNO|MB_ICONWARNING))
				{
					passWordElement = NumberElement->NextSiblingElement();
					TiXmlNode *PassWord = passWordElement->FirstChild();
					PassWord->SetValue(m_PassWord);
					pDoc->SaveFile(FileNmae);
				    MessageBox("密码修改成功,下次登录生效");
				}
					goto end;
			}
			SonElement=SonElement->NextSiblingElement();
		}
           }

修改效果如下

   

第四步,信息删除,本例为查找账号名m_Number对该用户进行删除

const char *FileName = "res\\Number.xml";
	 TiXmlDocument *pDoc = new TiXmlDocument();
	 if (!pDoc->LoadFile(FileName))
	 {
		 MessageBox("Number.xml文件损坏","加载失败",MB_OK | MB_ICONWARNING);
		 return ;
	 }
	 else
	 {
		 TiXmlElement *RootElement = pDoc->RootElement();
		 TiXmlElement *PersonElement = RootElement->FirstChildElement();
		 TiXmlElement *NumberElement = PersonElement->FirstChildElement();
		 TiXmlElement *PassWordElement = NumberElement->NextSiblingElement();
		 while (PersonElement)
		 {
			 NumberElement = PersonElement->FirstChildElement();
			 if (NumberElement->GetText() ==  m_Number)
			 {
				 RootElement->RemoveChild(PersonElement);
				 MessageBox("删除成功");
				 break;
			 }
			 else
			 {
				  PersonElement = PersonElement->NextSiblingElement();//节点后移
			 }
			
		 }
		 pDoc->SaveFile(FileName);
          }

至于统计什么的,就是查找与显示的变异。

第一次写,希望可以帮到一些读者。谢谢~

如有疑问咨询微信li9800914


推荐博文

http://blog.csdn.net/alan_chen_2011/article/details/7347276



MFC编程课程设计——飘动的气球

这是14年六月份的课程设计,虽说是公共选修课,但真正着手写的时候,一连写了三天,期间参考了不少经典的书籍,还在一些论坛里找到了不少问题的答案。既然来于网络,自然也应该将最后的成果放回网络,也好有点意义...
  • Imkiimki
  • Imkiimki
  • 2016年11月05日 19:13
  • 855

三种解析xm文件的方法

xml代码: xml version="1.0" encoding="UTF-8"?>      HD>        disk name="C">          capacity>...
  • liuyangan2008
  • liuyangan2008
  • 2012年09月20日 09:46
  • 1988

餐饮管理系统 VC MFC

课程设计题目:    餐饮管理系统       问题阐述与分析:            本餐饮管理系统适用于中小型餐馆和酒店使用,省时省力,操作简便,界面友好,可以完成酒店的点...
  • bcj296050240
  • bcj296050240
  • 2015年05月15日 16:28
  • 2432

xm、midi音频格式文件互相转化方法及工具

mptrackchs MadTracker
  • wskia
  • wskia
  • 2017年12月21日 21:05
  • 245

文件系统的设计与实现(操作系统课程设计)

目录 一、设计目的、意义 1 二、 设计分析 1 三、方案分析 2 四、功能模块实现 3 五、最终结果分析 4 六、 设计体会 5   一、设计目的、意义 1.通过模拟文件系统的实现,深入理解操...
  • u013255737
  • u013255737
  • 2016年05月08日 11:22
  • 6196

MFC学习笔记之:MFC文件、文件夹操作完全整理

BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName ); 这个函数可以移一个文件,或目录(包括子目录),例:...
  • a408789699
  • a408789699
  • 2011年05月06日 15:21
  • 1352

Android XmlResourceParser解析Xm文件实例

本篇将通过一个实例介绍一下下XmlResourceParser解析xml文件的具体方法,首先给出xml文件结构: 1.timezones.xml: Douala Kampala ...
  • dadaxiaoxiaode
  • dadaxiaoxiaode
  • 2013年07月29日 17:51
  • 3234

MFC 进行CSV文件的读写

Csv.h   #pragma once #include "afx.h" class CCSVFile : public CStdioFile { public:  enum Mode...
  • Howard_Liu1314
  • Howard_Liu1314
  • 2012年06月25日 00:30
  • 7807

MFC中ftream操作CSV文件

CSV格式不用多说,逗号分隔,用文本编辑器打开,是按行存储;用excel打开,就是以”,”分隔的。 在实际操作中,发现fstream文件可以进行行获取,下面用fstream存储和读取,并提取了分隔后...
  • wanggao_1990
  • wanggao_1990
  • 2015年11月22日 18:15
  • 1071

VS2010/MFC 读写excel文件 操作类

操作类参考一:http://blog.csdn.net/superbfly/article/details/18040445          二维数组操作参考二 : http://www.cnblo...
  • yu_fujiang
  • yu_fujiang
  • 2016年05月28日 18:07
  • 4220
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC课程设计以及对xm文件的操作
举报原因:
原因补充:

(最多只允许输入30个字)