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;
}

 

 

原创粉丝点击