本程序用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>