C++建立通讯录XML文件(包含XML文件的各种操作)
来源:互联网 发布:js取数组最后一个值 编辑:程序博客网 时间:2024/05/21 22:48
C++建立通讯录XML文件(包含XML文件的各种操作)
本程序用tinyxml解析器对xml文件对其进行解析,工程中只需添加并引用tinyxml的二个头文件和四个源文件tinyxml.h、tinystr.h、tinyxml.cpp、tinystr.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp(有时需要修改一点东西,比如在vs下,这四个源文件需要添加#include "stdafx.h")即可(如有需要可以参考tinyxml中的testxml.cpp源文件), tinyxml的程序包可以在网上下载。
-----------------------------------------------myStruct.h----------------------------------------------------
#define MAX 50
//由于很多tinyxml函数不支持string。所以这里用c字符串
struct Attribute
{
char attriName[MAX]; //xml元素属性名
char attriValue[MAX]; //xml元素属性值
};
struct Element
{
char elemName[MAX]; //xml元素名
Attribute elemAttri; //xml元素属性
char elemText[MAX]; //xml元素text内容
};
-----------------------------------------------XMLFunction.h----------------------------------------------
#include "myStruct.h"
#include "tinyxml.h"
//检查通讯录文件是否存在
void IsHaveXmlFile(const char *direct);
//获取我的信息
Element getMyInfo(const char* direct);
//创建的联系人xml
void create_xml(const char* direct,Element &mXmlElement);
//打印所有联系人
bool printAllContacter(const char *direct);
//在已经创建的联系人xml尾部文件中增加联系人
bool insertSubElement(const char* direct,const Element &inElement);
//查找联系人信息
Element searchSubElement(const char *direct,const char *searchName);
//删除指定的联系人
int removeSubElement(const char *direct,const char*removeName);
//替换已有联系人信息
int replaceSubElement(const char *direct,const Element &newElem);
//清空联系人
int clear(const char *direct);
---------------------------------------------XMLFunction.cpp-------------------------------------------#include "stdafx.h"
#include "XMLFunction.h"
#include<fstream>
#include<iostream>
using namespace std;
//文件操作前,检查文件是否存在且是否能够打开且存在根元素
//如果是,则xmlDoc指向xml文件,xmlRootElement;指向此文件根元素
TiXmlElement *xmlRootElement=NULL;
TiXmlDocument *xmlDoc=NULL;
//查询联系人xml文件是否存在
void IsHaveXmlFile(const char *direct)
{
bool openFlag = true;
//加载一个XML的文档对象。
xmlDoc = new TiXmlDocument(direct);
if(!xmlDoc->LoadFile()) //是tinyXml会自动处理文档的BOM
{
openFlag = false;
cout<<"此通讯录文件加载不成功!"<<endl;
}
if(xmlDoc ==NULL)
{
openFlag = false;
cout<<"此通讯录文件不存在!"<<endl;
}
//获得根元素
xmlRootElement = xmlDoc->RootElement();
if(xmlRootElement == NULL)
{
openFlag = false;
cout<<"此通讯录文件无根元素!"<<endl;
}
if(!openFlag)
{
xmlRootElement = NULL;
xmlDoc = NULL;
}
}
//获取我的信息
Element getMyInfo(const char* direct)
{
//首先检查指定文件是否存在,不存在则不允许插入,要先用C/c命令创建
Element myElem;
IsHaveXmlFile(direct);
if(xmlDoc == NULL)
{
strcpy_s(myElem.elemAttri.attriName,"unname");
cout<<"请用下面的C/c命令创建此通讯录文件!"<<endl;
}
else
{
//创建一个XML的文档对象。
//TiXmlDocument *myDoc=new TiXmlDocument();
//myDoc->LoadFile(direct);
//TiXmlElement *RootElem = myDoc->RootElement();
strcpy_s(myElem.elemName ,xmlRootElement->Value());
strcpy_s(myElem.elemAttri.attriName,xmlRootElement->FirstAttribute()->Name());
strcpy_s(myElem.elemAttri.attriValue,xmlRootElement->FirstAttribute()->Value());
}
return myElem;
}
//创建的联系人xml
void create_xml(const char* direct,Element &mXmlElement)
{
fstream file_in1(direct,ios::in|ios::out|ios::trunc);
file_in1.close();
//创建一个XML的文档对象。
TiXmlDocument *myDoc=new TiXmlDocument();
myDoc->LoadFile(direct);
TiXmlDeclaration* decl = new TiXmlDeclaration("1.0","utf-8","yes");
myDoc->LinkEndChild(decl);
//创建一个根元素并连接。
TiXmlElement *RootElem =new TiXmlElement(mXmlElement.elemName);
RootElem->SetAttribute(mXmlElement.elemAttri.attriName,mXmlElement.elemAttri.attriValue);
myDoc->LinkEndChild(RootElem);
myDoc->SaveFile();
}
//打印所有联系人
bool printAllContacter(const char *direct)
{
IsHaveXmlFile(direct);
bool pFlag;
if(xmlDoc != NULL)
{
xmlDoc->Print();
pFlag = true;
}
else
pFlag = false; // 检查文件存在的各种错误
return pFlag;
}
//在已经创建的联系人xml尾部文件中增加联系人
bool insertSubElement(const char* direct,const Element &inElement)
{
//写入文件
IsHaveXmlFile(direct);
bool insFlag ;
if(xmlDoc != NULL)
{
TiXmlElement *newElem = new TiXmlElement(inElement.elemName);
xmlRootElement->LinkEndChild(newElem);
newElem->SetAttribute(inElement.elemAttri.attriName,inElement.elemAttri.attriValue);
TiXmlText *text = new TiXmlText(inElement.elemText);
newElem->LinkEndChild(text);
xmlDoc->SaveFile(direct);
insFlag = true;
}
else
insFlag = false; // 检查文件存在的各种错误
return insFlag;
}
//查找联系人信息
Element searchSubElement(const char *direct,const char *searchName)
{
Element childElem;
IsHaveXmlFile(direct);
if(xmlDoc != NULL)
{
TiXmlElement * pElem = NULL;
for(pElem=xmlRootElement->FirstChildElement();pElem;pElem=pElem->NextSiblingElement())
{
if(!strcmp(pElem->FirstAttribute()->Name(),searchName))
{
break;
}
}
if(pElem)
{
cout << "解析成功" << endl;
strcpy_s(childElem.elemAttri.attriName ,pElem->FirstAttribute()->Name());
strcpy_s(childElem.elemAttri.attriValue, pElem->FirstAttribute()->Value());
strcpy_s(childElem.elemText, pElem->GetText());
}
else
{
strcpy_s(childElem.elemAttri.attriName,"0");;
}
}
else
strcpy_s(childElem.elemAttri.attriName,"-1"); //检查文件存在的各种错误
return childElem;
}
//删除指定的联系人
int removeSubElement(const char *direct,const char*removeName)
{
IsHaveXmlFile(direct);
int remFlag;
if(xmlDoc != NULL)
{
TiXmlElement * pElem = NULL;
for(pElem=xmlRootElement->FirstChildElement();pElem;pElem=pElem->NextSiblingElement())
if(!strcmp(pElem->FirstAttribute()->Name(),removeName))
break;
if(pElem)
{
remFlag = (int)xmlRootElement->RemoveChild(pElem);
xmlDoc->SaveFile(direct);
}
else
remFlag = -1;//没有找到此联系人
}
else
remFlag = -2; //检查文件存在的各种错误
return remFlag;
}
//替换已有联系人信息
int replaceSubElement(const char *direct,const Element &newElem)
{
int repFlag;
IsHaveXmlFile(direct);
if(xmlDoc != NULL)
{
TiXmlElement * pElem = NULL;
for(pElem=xmlRootElement->FirstChildElement();pElem;pElem=pElem->NextSiblingElement())
if(!strcmp(pElem->FirstAttribute()->Name(),newElem.elemAttri.attriName))
break;
if(pElem)
{
TiXmlElement *repElem = new TiXmlElement(pElem->Value());
repElem->SetAttribute(newElem.elemAttri.attriName,newElem.elemAttri.attriValue);
TiXmlText *text = new TiXmlText(newElem.elemText);
repElem->LinkEndChild(text);
TiXmlNode *node =xmlRootElement->ReplaceChild(pElem,*repElem);
xmlDoc->SaveFile(direct);
if(node !=NULL)
repFlag = 1;
else
repFlag = 0;
}
else
repFlag = -1;//没有找到此联系人
}
else
repFlag = -2; //检查文件存在的各种错误
return repFlag;
}
//清空联系人
int clear(const char *direct)
{
int cleFlag ;
cout<<"您确定要清空您的通讯录吗?(Y/N)"<<endl;
char cmd1;
cin>>cmd1;
if(cmd1=='Y'||cmd1=='y')
{
cout<<"您真的确定要清空您的通讯录吗?(Y/N)"<<endl;
char cmd2;
cin>>cmd2;
if(cmd2=='Y'||cmd2=='y')
{
if(xmlDoc != NULL)
{
xmlRootElement->Clear();
xmlDoc->SaveFile(direct);
cleFlag = 1;
}
else cleFlag = -1; //检查文件存在的各种错误
}
else
cleFlag = 0;
}
else
cleFlag = 0;
return cleFlag;
}
-----------------------------------------------------main.cpp-----------------------------------------------// C++XMLContacter.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "XMLFunction.h"
#include<iostream>
#include<fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//在num.txt文件中获取目前通讯录中已有(i-1)联系人加入,当删除时不计(不会减一)
//用一个字符串加上i表示xml元素名,表示第几个联系人
int i;
char *direct = "contacter.xml";
ifstream file_in1("num.txt",ios::in);
char c;
file_in1.get(c);
file_in1.close();
i = (int)(c-'0');
Element myElement;
Element getMyElem;
cout<<"请输入自己的名字:";
cin>>myElement.elemAttri.attriName;
cout<<"请输入自己的电话号码:";
cin>>myElement.elemAttri.attriValue;
strcpy_s(myElement.elemName,"MyContacter");
getMyElem = getMyInfo(direct);
if(strcmp(getMyElem.elemAttri.attriName,"unname")
&&strcmp(getMyElem.elemAttri.attriName,myElement.elemAttri.attriName))
{
cout<<"自己名字输入错误!"<<endl;
system("pause");
return 0;
}
//strcpy_s(myElement.elemText,"0");
cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
cout<<"------------------------请选择您要进行的操作:-----------------------------------"<<endl;
cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
cout<<"------------------------建立联系人XML文件(C/c)----------------------------------"<<endl;
cout<<"---------------------------打印所有联系人(P/p)----------------------------------"<<endl;
cout<<"---------------------------查询某位联系人(S/s)----------------------------------"<<endl;
cout<<"---------------------------新增某位联系人(I/i)----------------------------------"<<endl;
cout<<"---------------------------更新某位联系人(U/u)----------------------------------"<<endl;
cout<<"---------------------------删除某位联系人(R/r)----------------------------------"<<endl;
cout<<"-------------------------------清空通讯录(Q/q)----------------------------------"<<endl;
cout<<"-------------------------------退出程序(E/e)------------------------------------"<<endl;
char cmd;
cin>>cmd;
while(1)
{
if(cmd=='C'||cmd=='c')
{
char cmd1;
cout<<"是否确定要创建文件contacter.xml,如果创建并此文件存在里面原来的内容将清空!(Y/N)"<<endl;
cin>>cmd1;
if(cmd1=='Y'||cmd1=='y')
{
//如果是重新创建通讯录则需要重新复制i为,表示当前文件中有0个联系人
i = 1;
create_xml(direct,myElement);
Element friElement;
while(1)
{
cout<<"*********************************************"<<endl;
cout<<"请输入好友"<<i<<"的名字(以0结束):";
cin>>friElement.elemAttri.attriName;
if(!strcmp(friElement.elemAttri.attriName,"0"))
break;
cout<<"请输入他(她)的电话号码:";
cin>>friElement.elemAttri.attriValue;
cout<<"属性为:";
cin>>friElement.elemText;;
strcpy_s(friElement.elemName, "contacter");
int len = strlen(friElement.elemName);
//在后面追加序号i,表示第几个联系人
friElement.elemName[len] = (char)(i+'0');
friElement.elemName[len+1] ='\0';
int creflag = insertSubElement(direct,friElement);;
if(creflag)
{
cout<<"插入联系人成功!"<<endl;
i++;
}
else
cout<<"插入联系人失败!"<<endl;
}
}
}
else if(cmd=='P'||cmd=='p')
{
bool priflag = printAllContacter(direct);
if(priflag)
cout<<"打印联系人成功!"<<endl;
else
cout<<"打印联系人失败!"<<endl;
}
else if(cmd=='S'||cmd=='s')
{
cout<<"请输入您要查询的联系人的名字:";
char seaName[MAX];
cin>>seaName;
Element getElem= searchSubElement(direct,seaName);
if(!strcmp(getElem.elemAttri.attriName,"0"))
cout<<"通讯录中没有此联系人!"<<endl;
else if(strcmp(getElem.elemAttri.attriName,"-1"))
{
cout<<"此联系人信息如下:"<<endl;
cout<<"名字:"<<getElem.elemAttri.attriName<<" 电话号码:"<<getElem.elemAttri.attriValue<<endl;
}
else
cout<<"查询失败!"<<endl;
}
else if(cmd=='I'||cmd=='i')
{
Element newFriElement;
bool insflag;
while(1)
{
cout<<"*********************************************"<<endl;
cout<<"请输入好友"<<i<<"的名字(以0结束):";
cin>>newFriElement.elemAttri.attriName;
if(!strcmp(newFriElement.elemAttri.attriName,"0"))
break;
cout<<"请输入他(她)的电话号码:";
cin>>newFriElement.elemAttri.attriValue;
cout<<"属性为:";
cin>>newFriElement.elemText;
strcpy_s(newFriElement.elemName ,"contacter");
int len = strlen(newFriElement.elemName);
//在后面追加序号i,表示第几个联系人
newFriElement.elemName[len] = (char)(i+'0');
newFriElement.elemName[len+1] ='\0';
insflag = insertSubElement(direct,newFriElement);
if(insflag)
{
cout<<"新增联系人成功!"<<endl;
i++;
}
else
cout<<"新增联系人失败!"<<endl;
}
}
else if(cmd=='R'||cmd=='r')
{
cout<<"请输入你要删除的联系人的名字:"<<endl;
char removeName[MAX];
cin>>removeName;
char cmd2;
cout<<"您确定要删除吗?(Y/N)"<<endl;
cin>>cmd2;
if(cmd2=='Y'||cmd2=='y')
{
int remflag;
remflag = removeSubElement(direct,removeName);
if(remflag==1)
cout<<"删除此联系人成功!"<<endl;
else if(remflag==-1)
cout<<"此通讯录文件无此联系人!"<<endl;
else
cout<<"删除此联系人失败!"<<endl;
}
else
cout<<"您放弃了此操作!";
}
else if(cmd=='U'||cmd=='u')
{
char cmd3;
cout<<"您确定要更新吗?(Y/N)"<<endl;
cin>>cmd3;
if(cmd3=='Y'||cmd3=='y')
{
Element upElem;
cout<<"请输入您要更新的联系人的名字:";
cin>>upElem.elemAttri.attriName;
cout<<"请输入您要更新此人的电话号码:";
cin>>upElem.elemAttri.attriValue;
cout<<"请输入您要更新此人的属性:";
cin>>upElem.elemText;
int renewflag = replaceSubElement(direct,upElem);
if(renewflag==1)
cout<<"更新此联系人成功!"<<endl;
else if(renewflag==-1)
cout<<"通讯录中没有此联系人!"<<endl;
else
cout<<"更新此联系人失败!"<<endl;
}
else
cout<<"您放弃了此操作!";
}
else if(cmd=='Q'||cmd=='q')
{
int cleflag = clear(direct);
if(cleflag==1)
{
i=1; //清空同时要更新联系人个数
cout<<"清空联系人成功!"<<endl;
}
else if(cleflag==0)
cout<<"您放弃了此操作!";
else
cout<<"清空联系人失败!"<<endl;
}
else if(cmd=='E'||cmd=='e')
break;
else
cout<<"命令出错,请重新输入!"<<endl;
cout<<endl;
cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
cout<<"------------------------请选择您要进行的操作:-----------------------------------"<<endl;
cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
cin>>cmd;
}
//在num.txt文件中更新联系人个数
ofstream file_out1("num.txt",ios::out|ios::trunc);
file_out1.put((char)(i+'0'));
file_out1.close();
system("pause");
return 0;
}
建立的xml文件如下:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<MyContacter heyong="151">
<contacter1 luoyao="152">friend1</contacter1>
<contacter2 liuhuan="153">friend2</contacter2>
<contacter3 lina="154">classmate</contacter3>
<contacter4 zhouqian="155">classmate</contacter4>
<contacter5 hepeng="133">nephew</contacter5>
</MyContacter>
- C++建立通讯录XML文件(包含XML文件的各种操作)
- XML文件各种操作--源码
- c#XML文件操作类 实用的XML操作
- C#.Net操作XML文件的数据
- XML 文件的操作
- XML文件的操作
- XML文件的操作
- xml文件的操作
- xml 文件的操作
- TinyXML来操作XML文件(C++)
- C#XML文件操作类(二)
- C#XML文件读写操作
- C#XML文件读写操作
- 在应用程序中对xml文件的各种操作
- 使用Dom4j对XML文件的各种操作
- 【转】C#对XML文件的各种操作实现方法
- C#对XML文件的各种操作实现方法
- [C#]实现对XML文件的基本操作(创建xml文件,增、删、改、查 xml节点信息)
- 泛解析 和主机头配置
- Actual.Window.Manager.v6.2
- 对类加载的理解
- build busybox-1.1.3 (2011-07-25 20:42)
- C#屏幕抓图程序
- C++建立通讯录XML文件(包含XML文件的各种操作)
- 驱动文件操作学习与实践
- linux之TCP/IP创建线程实现简单聊天(2)
- Alices.Tea.Cup.Madness.v1.0.1.80.Cracked-F4CG\
- using genext2fs to make ramdisk.gz (2011-07-25 23:26)
- 学习笔记之C#parm、命名空间、字符串处理
- Java keytool工具的作用及使用方法
- Installing uClibc-0.9.28 to your rootfs(arm) (2011-07-26 08:59)
- 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器