程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++建立通訊錄XML文件(包含XML文件的各種操作)

C++建立通訊錄XML文件(包含XML文件的各種操作)

編輯:C++入門知識

本程序用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 www.2cto.com

//由於很多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>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved