• tinyxml的封装与使用


    tinyxml是个高效精简的xml解析开源代码.

    针对tinyxml直接使用对于对xml不是很熟悉的入门新手来说,有些概念难以理解,因此我将其封装后,供大家使用.

    头文件:

    #include<string>

    #include "tinyxml.h"

    using namespace std;

    class CXML

    {

    public:

        CXML(void)

        {

        }

        ~CXML(void)

        {

        }

    private:

        TiXmlDocument m_xml;

        TiXmlElement* pElement;

    private:

        TiXmlElement* getFirstElement(string ElementMark,TiXmlElement* pcrElement);

    public:

        //解析xml字符串

        int ParseXmlStr(string xmlstr);

        //解析xml文件

        int ParseXmlFile(string xmlFile);

        //根据标签取值

        int getFirstElementValue(string ElementMark,string& value);

        //针对同一标签的记录取值,如果返回值是0表明再无此标签内容值可取

        int getNextElementValue(string ElementMark,string& value);

        //取得属性值

        int getElementAttributeValue(string AttributeName,string& value);

        //获取根结点

        TiXmlElement* getRootElement();

        //返回当前的xml字符串

        string getXmlStr();

        //清空解析的内容

        void Clear();

        //添加子节点

        TiXmlElement* addXmlRootElement(string ElementMark);//添加一个根节点

        //添加子节点

        TiXmlElement* addXmlChildElement(TiXmlElement* pElement,string ElementMark);

        //给节点添加值

        void addElementValue(TiXmlElement* pElement,string value);

        //添加属性及属性值

        void addXmlAttribute(TiXmlElement* pElement,string AttributeMark,string value);

        //添加声明

        void addXmlDeclaration(string vesion,string encoding,string standalone);

        //添加注释

        void addXmlComment(TiXmlElement* pElement,string Comment);

        //将xml内容保存到文件

        void saveFile(string FileName);

    };

    ///////////////////实现文件

    #include "XML.h"

    int CXML::ParseXmlFile(string xmlFile)

    {

        int result=0;

        try

        {

            if(m_xml.LoadFile(xmlFile.c_str()))

                result=1;

            else

                result=0;

        }

        catch(...)

        {

        }

        return result;

    }

    int CXML::ParseXmlStr(std::string xmlStr)

    {

        int result=0;

        if(xmlStr=="")

            return 0;

        try

        {

            if(m_xml.Parse(xmlStr.c_str()))

                result=1;

            else

                result=0;

        }

        catch(...)

        {

        }

        return result;

    }

    TiXmlElement* CXML::getFirstElement(string ElementMark,TiXmlElement* pcrElement)

    {

        TiXmlElement* pElementtmp=NULL;

        pElementtmp=pcrElement;

        while(pElementtmp)

        {

            if(strcmp(pElementtmp->Value(),ElementMark.c_str())==0)

            {

                //printf("%s\r\n",pElementtmp->Value());

                return pElementtmp;

            }

            else

            {

                TiXmlElement* nextElement=pElementtmp->FirstChildElement();

                while(nextElement)

                {

                    //printf("%s\r\n",nextElement->Value());

                    if(strcmp(nextElement->Value(),ElementMark.c_str())==0)

                    {

                        return nextElement;

                    }

                    else

                    {

                        TiXmlElement* reElement=NULL;

                        reElement=getFirstElement(ElementMark,nextElement);

                        if(reElement)

                        {

                            return reElement;

                        }

                    }

                    nextElement=nextElement->NextSiblingElement();

                }

            }

            pElementtmp=pElementtmp->NextSiblingElement();

        }

        return NULL;

    }

    //根据标签取值

    int CXML::getFirstElementValue(string ElementMark,string& value)

    {

        int result=0;

        if(ElementMark=="")

            return 0;

        try

        {

            TiXmlElement* pcrElement=NULL;

            pcrElement=m_xml.RootElement();

            pcrElement=this->getFirstElement(ElementMark,pcrElement);

            if(pcrElement)

            {

                this->pElement=pcrElement;

                value=this->pElement->GetText();

                result=1;

            }

        }

        catch(...)

        {

        }

        return result;

    }

    int CXML::getNextElementValue(string ElementMark,string& value)

    {

        value="";

        this->pElement=this->pElement->NextSiblingElement(ElementMark.c_str());

        if(this->pElement)

        {

            value=this->pElement->GetText();

            return 1;

        }

        return 0;

    }

    string CXML::getXmlStr()

    {

        string result="";

        try

        {

            TiXmlPrinter printer;

            m_xml.Accept(&printer);

            result=printer.CStr();

        }

        catch(...)

        {

        }

        return result;

    }

    void CXML::Clear()

    {

        m_xml.Clear();

    }

    //添加子节点

    TiXmlElement* CXML::addXmlRootElement(string ElementMark)

    {

        TiXmlElement* RootElement=new TiXmlElement(ElementMark.c_str());

        m_xml.LinkEndChild(RootElement);

        return RootElement;

    }

    TiXmlElement* CXML::addXmlChildElement(TiXmlElement* pElement,string ElementMark)

    {

        if(pElement)

        {

            TiXmlElement* tempElement=new TiXmlElement(ElementMark.c_str());

            pElement->LinkEndChild(tempElement);

            return tempElement;

        }

        return 0;

    }

    void CXML::addElementValue(TiXmlElement *pElement, std::string value)

    {

        if(pElement)

        {

            TiXmlText *pContent=new TiXmlText(value.c_str());

            pElement->LinkEndChild(pContent);

        }

    }

    //添加属性及属性值

    void CXML::addXmlAttribute(TiXmlElement* pElement,string AttributeMark,string value)

    {

        if(pElement)

        {

            pElement->SetAttribute(AttributeMark.c_str(),value.c_str());

        }

    }

    //添加声明

    void CXML::addXmlDeclaration(string vesion,string encoding,string standalone)

    {

        TiXmlDeclaration *pDeclaration=new TiXmlDeclaration(vesion.c_str(),encoding.c_str(),standalone.c_str());

        m_xml.LinkEndChild(pDeclaration);

    }

    //添加注释

    void CXML::addXmlComment(TiXmlElement* pElement,string Comment)

    {

        if(pElement)

        {

            TiXmlComment *pComment=new TiXmlComment(Comment.c_str());

            pElement->LinkEndChild(pComment);

        }

    }

    TiXmlElement* CXML::getRootElement()

    {

        return m_xml.RootElement();

    }

    //取得属性值

    int CXML::getElementAttributeValue(string AttributeName,string& value)

    {

        if(this->pElement->Attribute(AttributeName.c_str()))

        {

            value=this->pElement->Attribute(AttributeName.c_str());

            return 1;

        }

        return 0;

    }

    void CXML::saveFile(string FileName)

    {

        this->m_xml.SaveFile(FileName.c_str());

    }

    //////////////////////////////////////////

    注意:

    xml字符串如果不是从文件中读出,那么必须以"\r\n"结束,否则解析失败

  • 相关阅读:
    servlet的提交
    servlet的doPost 和doGet和web文件结构
    helloServlet
    捕鱼达人
    The 2018 ACM-ICPC China JiangSu Provincial Programming Contest I. T-shirt
    ACM-ICPC 2017 Asia Urumqi A. Coins
    Nordic Collegiate Programming Contest 2015​ B. Bell Ringing
    变量
    hiho 1050 树的直径
    ACM-ICPC 2017 Asia Urumqi G. The Mountain
  • 原文地址:https://www.cnblogs.com/flying_bat/p/1114211.html
Copyright © 2020-2023  润新知