tinyxml的封装与使用(转载)
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的封装与使用(转载)的更多相关文章
- Unity3D 与 objective-c 之间数据交互。iOS SDK接口封装Unity3D接口 .-- 转载
Unity 3D 简单工程的创建.与Xcode 导出到iOS 平台请看这 Unity3D 学习 创建简单的按钮.相应事件 Unity C# 代码 using UnityEngine; using Sy ...
- 编译使用tinyxml
环境: win7 32位旗舰版,VS2010,tinyxml_2_6_2版本 1.下载tinyxml,并解压到tinyxml文件夹下 2.生成动态链接库 原生的Tinyxml只支持静态库(没有在.h文 ...
- C++使用TinyXML
参照一:http://qaohao.iteye.com/blog/496237 参照二:http://hi.baidu.com/lnylvoeegzcgnrr/item/af68fd9cde40fc1 ...
- 像使用数据库一样使用xml
目录 xml简介 语言结构 tinyxml 下载tinyxml 应用实例 tinyxml的封装 封装源码 实际应用 xml简介 XML 没什么特别的.它仅仅是纯文本而已.有能力处理纯文本的软件都可以处 ...
- 使用 json 模块,使json数据格式与Python字典dict数据格式互相转换,获取数据更加方便
一.定义 JSON 是一种数据格式 使用 javaScript (Java 死鬼破特)对象表示法 二.特点 1.JSON 与 XML格式数据的区别 ====== 两种格式的数据,都是跨语言,跨平台 c ...
- 将HTML5封装成android应用APK文件的几种方法(转载)
越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜 ...
- [转载]Vivado轻松实现IP封装
Vivado轻松实现IP封装 1.新建一个测试工程 工程化的设计方法是离不开工程的,第一步往往都是新建工程,后面我会学习去工程化的开发方法,可能会更加高效. 2.利用向导完成IP封装 2.1.启动IP ...
- 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)
转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...
- 将TinyXml快速入门的接口面向对象化(转载)
作者:朱金灿 来源:http://www.cnblogs.com/clever101 在TinyXml快速入门的系列文章中(详情见本博客),我只是将tinyxml类库解析xml文件的类封装为API接口 ...
随机推荐
- bzoj 2726: [SDOI2012]任务安排
Description 机 器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的 若干任务.从时刻0开始,这 ...
- MyBatis小抄
持续更新中. Every MyBatis application centers around an instance of SqlSessionFactory A cleaner approch t ...
- php使用websocket示例详解
一.php 中处理 websocket WebSocket 连接是由客户端主动发起的,所以一切要从客户端出发.第一步是要解析拿到客户端发过来的 Sec-WebSocket-Key 字符串. 复制代码代 ...
- 自定义php错误异常处理
set_exception_handler() 函数设置用户自定义的异常处理函数. 该函数用于创建运行时期间的用户自己的异常处理方法. 该函数会返回旧的异常处理程序,若失败,则返回 null. set ...
- Vuejs之开发环境搭建
Vue.js Vue.js是目前很火的一个前端框架,采用MVVM模式设计,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快 ...
- dubbo源码—dubbo简介
dubbo是一个RPC框架,应用方像使用本地service一样使用dubbo service.dubbo体系架构 上图中的角色: 最重要的是consumer.registry和provider con ...
- SQLSERVER 死锁标志
最开始做DBA的时候,整天死锁到头痛1222,至今都能回想到这个错误窗口: 死锁定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待 ...
- vue2.0笔记《二》组件
主要内容:如何注册组件.如何使用组件.父组件子组件之间值的传递 1.如何注册组件 第一步:通过import将子组件载入父组件的js中 // 第一步:通过import将子组件载入父组件的js中 impo ...
- npm安装删除模块以及cnpm淘宝镜像
npm安装模块 [$ npm install xxx]利用 npm 安装xxx模块到当前命令行所在目录: [$ npm install -g xxx]利用npm安装全局模块xxx: npm 删除模块 ...
- [Spark性能调优] 第四章 : Spark Shuffle 中 JVM 内存使用及配置内幕详情
本课主题 JVM 內存使用架构剖析 Spark 1.6.x 和 Spark 2.x 的 JVM 剖析 Spark 1.6.x 以前 on Yarn 计算内存使用案例 Spark Unified Mem ...