C++建立通讯录XML文件(包含XML文件的各种操作)(一)

2014-11-24 12:34:50 · 作者: · 浏览: 2

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

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<<"此通讯录文件加载不成功!"< }
if(xmlDoc ==NULL)
{
openFlag = false;
cout<<"此通讯录文件不存在!"< }


//获得根元素
xmlRootElement = xmlDoc->RootElement();
if(xmlRootElement == NULL)
{
openFlag = false;
cout<<"此通讯录文件无根元素!"< }
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命令创建此通讯录文件!"< }
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);
RootE