文档章节

tinyxml的封装与使用

rise-worlds
 rise-worlds
发布于 2016/06/20 13:39
字数 694
阅读 8
收藏 0

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"结束,否则解析失败

本文转载自:http://www.cnblogs.com/flying_bat/archive/2008/03/20/1114211.html

共有 人打赏支持
上一篇: 微操教学
rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
C++ 使用TinyXML解析XML文件

读取和设置xml配置文件是最常用的操作,TinyXML是一个开源的解析XML的C++解析库,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便...

LoSingSang
2018/07/17
0
0
大牛们帮忙看看 cmake命令报错 错误如下

CMake Error at C:/Program Files/CMake/share/cmake-3.0/Modules/FindPackageHandleS tandardArgs.cmake:136 (message): Could NOT find TinyXML (missing: TINYXML_LIBRARY TINYXML_INCLUD......

炸猪翅1
2014/06/21
1K
1
C++ XML 解析器:tinyxml

[tinyxml2]: http://www.grinninglizard.com/tinyxml2/index.html C++ XML 解析器:[tinyxml][tinyxml2] 1) [TinyXML-2][tinyxml2] 一个简单,轻量,高效的C++ XML 解析器,能够很容易得整合......

加壹
2014/04/24
0
0
TinyXML:一个优秀的C++ XML解析器

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解...

zmldndx
2013/10/10
0
0
TinyXml 读写XML文件

使用Tinyxml创建和读取XML文件的优点:1,可在Windows和Linux中使用;2,方便易学,易用,可在http://sourceforge.net/projects/tinyxml/获取源代码。将其中的文件tinystr.h,tinyxml.h,tin...

鉴客
2011/12/10
3.5K
3

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot2.x配置Cors跨域

SpringBoot2.x配置Cors跨域 1 跨域的理解 跨域是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,...

水木星辰
18分钟前
1
0
一文搞懂TCP与UDP的区别

**摘要:**计算机网络基础 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有。 引言 网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TC...

Fundebug
20分钟前
2
0
Hanlp1.7版本的新增功能一览

Hanlp1.7版本在去年下半年的时候就随大快的DKH1.6版本同时发布了,截至目前1.7大版本也更新到了1.7.1了。本篇分别就1.7.0和1.7.1中新增的功能做一个简单的汇总介绍。 HanLP 是由一系列模型与...

左手的倒影
28分钟前
1
0
Linux之PAM可动态加载的认证模块

在Linux中执行有些程序时,这些程序在执行前首先要对启动它的用户进行认证,符合一定的要求之后才允许执行,例如login, su等。在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(P...

城市之雾
28分钟前
1
0
程序员接私活那些坑

前言 最近有很多人问我私活怎么样?有什么坑,我之前也是接了几个私活,当然也有稳定的收入。我们也来分享一下。前几天发现了一个帖子很不错,我们来分享一下 注:本文转自 : http://blog.cs...

终端研发部
35分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部