tinyxml 增删查 节点 子节点
来源:互联网 发布:怎么安装java 编辑:程序博客网 时间:2024/06/09 22:05
头文件
#ifndef READWRITEXML_H
#define READWRITEXML_H
#pragma warning(disable : 4786)
#include "tinyxml.h"
#include <map>
#include <list>
using namespace std;
enum ERRCODE{
ERR_PARAMER_NULL,
ERR_FIND_NULL,
ERR_NO_SON,
ERR_NO_ROOT,
ERR_NODE_EXIST,
ERR_SUECESS,
};
class CReadWriteXml
{
public:
//构造函数
CReadWriteXml();
// 析构函数
virtual ~CReadWriteXml();
//初始化函数
bool Init();
//读取指定类型的所有标签
ERRCODE ReadAllElement(const char* nType, map<string, string> &OutMap);
//读取指定标签的子节点
bool ReadSubElement(const char* nType, const char *pTagetStr,const char * pSourceStr,list<string> &OutList);
//添加节点
bool WriteElement(const char* nType, const char *pTagetStr,const char * pSourceStr );
//添加子节点
bool WriteSubElement(const char* nType, const char *pTagetStr,const char * pSourceStr, const char * pText);
//删除指定的节点
void DeleteElement(const char* nType, const char *pTagetStr,const char * pSourceStr);
//删除子节点
bool CReadWriteXml::DeleteSubElement(const char* nType, const char *pTagetStr,const char * pSourceStr,const char * pText);
//查找xml中是否有该节点
TiXmlElement* FindElement(const char* nType, const char *pTagetStr,const char * pSourceStr);
//成员变量
TiXmlDocument m_ReadWriteXml;
public:
//存储ini子节点的list
list<string> m_IniList;
};
#endif
资源文件
#include "ReadWriteXml.h"
#include "tinyxml.h"
#include <string>
#include <iostream>
using namespace std;
#define INI_TARGETFILE "targetfile" //目标文件
#define INI_SOURCEFILE "sourcefile" //比较文件
#define INIT_XMLPATH "E:\\各类学习工程\\filesearch_yly\\Procject_Test\\ProjectTest\\xml\\ini2.xml"
CReadWriteXml::CReadWriteXml():m_ReadWriteXml()
{
}
// 析构函数
CReadWriteXml::~CReadWriteXml()
{
}
//初始化函数
bool CReadWriteXml::Init()
{
m_ReadWriteXml.LoadFile(INIT_XMLPATH);
if ( m_ReadWriteXml.Error() )
{
return false;
}
return true;
}
//读取所有节点
ERRCODE CReadWriteXml::ReadAllElement(const char* nType,map<string, string> &OutMap)
{
if (NULL == nType)
{
//cout << "error type " <<endl;
return ERR_PARAMER_NULL;
}
TiXmlElement *RootElement = m_ReadWriteXml.RootElement();
const char *pTagetStr = NULL;
const char *pSourceStr = NULL;
if (NULL == RootElement)
{
//cout << "no elem " << endl;//for Test;
return ERR_NO_ROOT;
}
TiXmlElement *FirstPerson = RootElement->FirstChildElement(nType);
TiXmlElement *Element = FirstPerson;
for(; Element; Element = Element->NextSiblingElement(nType))
{
//获取标签的属性
pTagetStr = Element->Attribute(INI_TARGETFILE);
pSourceStr = Element->Attribute(INI_SOURCEFILE);
//判断获取的标签是不是需要的标签
if(!(pTagetStr && pSourceStr))
{
continue;
}
else
{
//ReadSubElement(nType,Element);
OutMap.insert(make_pair(pTagetStr,pSourceStr));
}
}
return ERR_SUECESS;
}
bool CReadWriteXml::ReadSubElement(const char* nType, const char *pTagetStr, const char * pSourceStr, list<string>& OutList)
{
if (NULL == nType || NULL == pTagetStr || NULL == pSourceStr)//返回错误码传入参数为空
{
return false;
}
TiXmlElement * pFind = FindElement(nType,pTagetStr,pSourceStr);//使用错误码提示找不到节点错误,
if (NULL == pFind)
{
return false;
}
TiXmlElement * pSon = pFind->FirstChildElement();//应该使用错误码提示没有子节点而非读取失败
if (NULL == pSon)
{
return false;
}
while (pSon)
{
OutList.push_back(pSon->GetText());
pSon = pSon->NextSiblingElement();
}
return true;
}
bool CReadWriteXml::WriteElement(const char* nType, const char *pTagetStr, const char * pSourceStr )
{
if (NULL == nType || NULL == pTagetStr || NULL == pSourceStr)//返回错误码传入参数为空
{
return false;
}
TiXmlElement *pRootTinyXml = m_ReadWriteXml.RootElement();
if (NULL == pRootTinyXml)
{
return false;
}
TiXmlElement * pTmp = FindElement(nType,pTagetStr,pSourceStr);//返回没有找到节点的错误码
if (NULL != pTmp)
{
return false;
}
TiXmlElement * Element = new TiXmlElement(nType);
Element->SetAttribute(INI_TARGETFILE,pTagetStr);
Element->SetAttribute(INI_SOURCEFILE,pSourceStr);
m_ReadWriteXml.RootElement()->LinkEndChild(Element);
m_ReadWriteXml.SaveFile(INIT_XMLPATH);
return true;
}
TiXmlElement* CReadWriteXml::FindElement(const char* nType, const char *pTagetStr,const char * pSourceStr)
{
if (NULL == nType || NULL == pTagetStr || NULL == pSourceStr)//返回错误码传入参数为空
{
return NULL;
}
const char *pszTagetStr = NULL;
const char *pszSourceStr = NULL;
TiXmlElement *Element = m_ReadWriteXml.RootElement()->FirstChildElement(nType);
for(; Element; Element = Element->NextSiblingElement(nType))
{
//获取标签的属性
pszTagetStr = Element->Attribute(INI_TARGETFILE);
pszSourceStr = Element->Attribute(INI_SOURCEFILE);
//判断获取的标签是不是需要的标签
//if((*pTagetStr == *pszTagetStr) && (*pSourceStr == *pszSourceStr))
if( string(pTagetStr) == string(pszTagetStr) && string (pSourceStr) == string (pszSourceStr))
{
return Element;
}
else
{
continue;
}
}
return NULL;
}
//写入子节点
bool CReadWriteXml::WriteSubElement(const char* nType,const char *pTagetStr, const char * pSourceStr ,const char * pText)
{
//首先要获取子节点看要添加的节点是不是在其中
if (NULL == nType || NULL == pSourceStr || NULL == pTagetStr || NULL == pText)
{
//cout << "error type !" << endl;
return false;
}
list<string> OutList;
TiXmlElement * pElement = FindElement(nType,pTagetStr,pSourceStr);
if (NULL == pElement)
{
return false;
}
ReadSubElement(nType,pTagetStr,pSourceStr,OutList);
list<string>::iterator it ;
for(it = OutList.begin(); it != OutList.end(); ++it)
{
if (string(pText) == string(it->c_str()))
{
//cout << "你要添加的节点已经存在!" << endl;
return false;
}
}
TiXmlElement *AddElement = new TiXmlElement("content");
pElement->LinkEndChild(AddElement);
TiXmlText *xmltxt = new TiXmlText(pText);
AddElement->LinkEndChild(xmltxt);
//proot->InsertAfterChild(proot->FirstChildElement(GetTypeName(nType)),*AddElement);
m_ReadWriteXml.SaveFile(INIT_XMLPATH);
return true;
}
void CReadWriteXml::DeleteElement(const char* nType, const char *pTagetStr,const char * pSourceStr)
{
TiXmlElement *pRoot = m_ReadWriteXml.RootElement();
TiXmlNode *pRootNode = pRoot->ToElement();
TiXmlElement *pDelete = FindElement(nType,pTagetStr,pSourceStr);
if (NULL == pDelete)
{
return ;
}
TiXmlNode *pNodeDelete = pDelete->ToElement();
pRoot->RemoveChild(pNodeDelete);
m_ReadWriteXml.SaveFile(INIT_XMLPATH);
}
bool CReadWriteXml::DeleteSubElement(const char* nType, const char *pTagetStr,const char * pSourceStr,const char * pText)
{
TiXmlElement * pDelete = FindElement(nType,pTagetStr,pSourceStr);
if (NULL == pDelete)
{
//cout << "你要删除的节点不存在" << endl;
return false;
}
TiXmlElement * pRoot = m_ReadWriteXml.RootElement();
TiXmlElement * pTmp = pDelete->FirstChildElement();
while (pTmp)
{
if (string(pTmp->GetText()) == string(pText))
{
break;
}
pTmp = pTmp->NextSiblingElement();
}
if (NULL == pTmp)
{
//cout << "z找不到你要删除的节点" << endl;
return false;
}
//while
TiXmlNode * pDelNode = pTmp->ToElement();
if (NULL == pDelNode)
{
cout << "没找到你要删除的节点" << endl;
return false;
}
pDelete->RemoveChild(pDelNode);
m_ReadWriteXml.SaveFile(INIT_XMLPATH);
return true;
}
- tinyxml 增删查 节点 子节点
- TinyXml快速入门(增删节点)
- javascript增删改查节点
- 节点的增删改查
- 节点的增删改查
- 二叉树的定义,节点的增删改查以及父节点、子节点的各种操作。
- jQuery节点的增删改查
- 【JavaScript】网页节点的增删改查
- zTree树节点的增删改查。
- HTML DOM节点的增删改查
- jquery 增删改查dom节点
- HTML DOM节点的增删改查
- javascript节点的增删改查
- html dom节点增删改查
- linux tinyxml删除节点
- linux tinyxml插入节点
- tinyxml 查找指定节点
- (5)通过节点的层次关系获取节点对象:增删改查节点
- asp.net在不同事件中获取主键等
- PL/SQL学习六
- 如何在编译器(vs2008)里设置调用别人写好的lib和dll
- [转]盖茨花巨资给学生配情绪手链 测上课无聊度
- 国外人工智能界牛人主页
- tinyxml 增删查 节点 子节点
- easyui之grid再封装
- 虚心接受 坚决不改:三星十亿美元“走自己的路让别人说去”
- type=image和type=submit的区别
- 经典嵌入式linux面试题
- 第九章 使用高级界面控件
- poj 2245
- onNewIntent调用时机
- 31. Rack ‘Em Up