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>

原创粉丝点击