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

时间: 2024-12-31 09:07:08

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

Jquery Ajax二次封装(部分转载)

/* ajax调用扩展 */ $.extend($,{ ajaxGetJson:function(url,data,callback) { $.ajax({ url:url, data:data, datatype:"json", method:"get", contentType: "application/json", beforeSend:function(){ //myLoad();//打开加载层 }, complete:function

谈谈C++的三大特性之一:封装性 (转载)

引言 对象的C++语言与以往的模块化程序语言的不同点在于:数据与操作数据的函数连接起来(即:封装性),结构紧凑,数据安全.正是由于这种封装性,大大强化了C++语言的可移植性及数据的安全性.类封装的形式很简单,本文主要谈谈封装的内部结构. 实例问题 类的内部数据存储地址仅表示相对对象首地址的地址偏移量.实例(引自:疯狂学习ING<作者网名>)如下: #include <iostream.h> class base { // 假定有很多成员 //..... //..... }; cla

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

Unity 3D 简单工程的创建.与Xcode 导出到iOS 平台请看这 Unity3D 学习 创建简单的按钮.相应事件 Unity C# 代码 using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public class testFeil : MonoBehaviour { [DllImport("__Internal")] private static extern v

使用c++替代使用c的封装!

见过很多人写c代码.用结构体将各种要素封装.如下转载一个使用epoll的例子: //    // a simple echo server using epoll in linux   //    // 2009-11-05   // 2013-03-22:修改了几个问题,1是/n格式问题,2是去掉了原代码不小心加上的ET模式; // 本来只是简单的示意程序,决定还是加上 recv/send时的buffer偏移 // by sparkling   //    #include <sys/sock

C++使用TinyXML

参照一:http://qaohao.iteye.com/blog/496237 参照二:http://hi.baidu.com/lnylvoeegzcgnrr/item/af68fd9cde40fc1a924f41f5 别人封装的TinyXML: .h文件 1 #include "xml\tinyxml.h" 2 #include <string> 3 using namespace std; 4 5 #if !defined(AFX_STDAFX_H__UDXML_EF9

《Effective C++》学习笔记——条款22

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 四.Designs and Declarations Rule 22:Declare date members private 规则 22:将成员变量声明为 private 1.为什么成员变量不该是 public ? > 从语法的一致性来看: 如果成员变量不是p

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

越来越多的开发者热衷于使用html5+JavaScript开发移动Web App.不过,HTML5 Web APP的出现能否在未来取代移动应用,就目前来说,还是个未知数.一方面,用户在使用习惯上,不喜欢在浏览器上输入复杂的网址:另一方面,Html5 Web App 存放在服务器端,在每次使用时需要进行数据传递,会造成流量浪费.有些开发者不想接触复杂的JAVA代码,那么,有什么办法,既可以使用HTMl5开发应 用,又可以将其简单封装成APK文件呢? 一.Android SDK中的WebView1.

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

Vivado轻松实现IP封装 1.新建一个测试工程 工程化的设计方法是离不开工程的,第一步往往都是新建工程,后面我会学习去工程化的开发方法,可能会更加高效. 2.利用向导完成IP封装 2.1.启动IP向导 方法为:ToolsàCreate and Package IP…,如图1所示. 图1 创建或者打包IP 点击Create and Package IP…命令,弹出向导,如图2所示. 图2 创建和封装IP向导 直接NEXT,进入下一界面,如图3所示.选择操作类型,我们这里不是新建IP,也不是要打

(转载)PCB封装尺寸

0805封装尺寸/0402封装尺寸/0603封装尺寸/1206封装尺寸(转载) 电子元器件 2010-09-08 21:21:48 阅读672 评论0   字号:大中小 订阅 封装尺寸与功率关系:  0201 1/20W  0402 1/16W  0603 1/10W  0805 1/8W  1206 1/4W 封装尺寸与封装的对应关系 0402=1.0mmx0.5mm 0603=1.6mmx0.8mm  0805=2.0mmx1.2mm  1206=3.2mmx1.6mm  1210=3.2m