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

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

头文件:

#include "tinystr.h"
#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=;

try

{

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

result=;

else

result=;

}

catch(...)

{

}

return result;

}

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

{

int result=;

if(xmlStr=="")

return ;

try

{

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

result=;

else

result=;

}

catch(...)

{

}

return result;

}

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

{

TiXmlElement* pElementtmp=NULL;

pElementtmp=pcrElement;

while(pElementtmp)

{

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

{

//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())==)

{

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

if(ElementMark=="")

return ;

try

{

TiXmlElement* pcrElement=NULL;

pcrElement=m_xml.RootElement();

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

if(pcrElement)

{

this->pElement=pcrElement;

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

result=;

}

}

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 ;

}

return ;

}  

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 ;

}

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 ;

}

return ;

}

void CXML::saveFile(string FileName)

{

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

}

注意:

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

tinyxml的封装与使用(转载)的更多相关文章

  1. Unity3D 与 objective-c 之间数据交互。iOS SDK接口封装Unity3D接口 .-- 转载

    Unity 3D 简单工程的创建.与Xcode 导出到iOS 平台请看这 Unity3D 学习 创建简单的按钮.相应事件 Unity C# 代码 using UnityEngine; using Sy ...

  2. 编译使用tinyxml

    环境: win7 32位旗舰版,VS2010,tinyxml_2_6_2版本 1.下载tinyxml,并解压到tinyxml文件夹下 2.生成动态链接库 原生的Tinyxml只支持静态库(没有在.h文 ...

  3. C++使用TinyXML

    参照一:http://qaohao.iteye.com/blog/496237 参照二:http://hi.baidu.com/lnylvoeegzcgnrr/item/af68fd9cde40fc1 ...

  4. 像使用数据库一样使用xml

    目录 xml简介 语言结构 tinyxml 下载tinyxml 应用实例 tinyxml的封装 封装源码 实际应用 xml简介 XML 没什么特别的.它仅仅是纯文本而已.有能力处理纯文本的软件都可以处 ...

  5. 使用 json 模块,使json数据格式与Python字典dict数据格式互相转换,获取数据更加方便

    一.定义 JSON 是一种数据格式 使用 javaScript (Java 死鬼破特)对象表示法 二.特点 1.JSON 与 XML格式数据的区别 ====== 两种格式的数据,都是跨语言,跨平台 c ...

  6. 将HTML5封装成android应用APK文件的几种方法(转载)

    越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...

  7. [转载]Vivado轻松实现IP封装

    Vivado轻松实现IP封装 1.新建一个测试工程 工程化的设计方法是离不开工程的,第一步往往都是新建工程,后面我会学习去工程化的开发方法,可能会更加高效. 2.利用向导完成IP封装 2.1.启动IP ...

  8. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)

    转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...

  9. 将TinyXml快速入门的接口面向对象化(转载)

    作者:朱金灿 来源:http://www.cnblogs.com/clever101 在TinyXml快速入门的系列文章中(详情见本博客),我只是将tinyxml类库解析xml文件的类封装为API接口 ...

随机推荐

  1. BZOJ 4818 SDOI2017 序列计数

    刚出炉的省选题,还是山东的. 自古山东出数学和网络流,堪称思维的殿堂,比某地数据结构成风好多了. 废话不说上题解. 1.题面 求:n个数(顺序可更改),值域为[1,m],和为p的倍数,且这些数里面有质 ...

  2. 添加MD5 密码加密

        编辑 /etc/grub/grub.conf 配置文件 password = 123456 password --md5 $5$H.........SS grub-crypt  --md5   ...

  3. Mysql 索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  4. Linux_异常_08_本机无法访问虚拟机web等工程

    这是因为防火墙的原因,把响应端口开启就行了. # Firewall configuration written by system-config-firewall  # Manual customiz ...

  5. springBoot系列教程07:异常捕获

    发生异常是很正常的事,异常种类也是千奇百怪,发生异常并不可怕,只要正确的处理,并正确的返回错误信息并无大碍,如果不进行捕获或者处理,分分钟服务器宕机是很正常的事 所以处理异常时,最基本的要求就是发生异 ...

  6. 我 对jvm 创建线程的一些了解

    1.jvm 每创建一个线程都会对应产生一个该线程的虚拟机栈,栈大小通过-Xss参数来设置,JDK1.5之后默认为1M 2.JVM创建线程需要内存,但这部分内存不使用堆内存(毕竟JVM虚拟机栈).对于3 ...

  7. MySQL数据库学习: 01 —— 数据库的概述

    壹 概述 一 了解SQL 1.1 数据库基础 1.1.1 什么是数据库 数据库(database)保存有组织的数据的容器(通常是一个文件或一组文件). 易混淆:人们常常用“数据库”这个词语来代表他们使 ...

  8. zookeeper部署到linux操作步骤

    安装zookeeper1. 上传上传zookeeper,在\01课前资料\02技术资料2. 移动[root@itcast-01 ~]# mv zookeeper-3.4.6.tar.gz /usr/l ...

  9. 用 HAproxy 搭建 RabbitMQ 集群

    构建参考: [ Rabbitmq cluster setup with HAproxy ] [ python demo ] RabbitMQ Cluster 遇到的问题 python pika 作为c ...

  10. ubuntu16编译安装mysql5.7

    安装环境: linux版本: ubuntu-16.04.3-desktop-amd64 mysql版本:mysql-boost-5.7.20.tar.gz 下载地址:https://dev.mysql ...