C++使用TinyXML
参照一:http://qaohao.iteye.com/blog/496237
参照二:http://hi.baidu.com/lnylvoeegzcgnrr/item/af68fd9cde40fc1a924f41f5

别人封装的TinyXML:
.h文件
#include "xml\tinyxml.h"
#include <string>
using namespace std; #if !defined(AFX_STDAFX_H__UDXML_EF91_4EF1_A2F2_53AD89B23C30__INCLUDED_)
#define AFX_STDAFX_H__UDXML_EF91_4EF1_A2F2_53AD89B23C30__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif /******************************************************************************
描述: 对tinyxml库封装的简单类:
1,创建、保存xml
2,动态创建节点,更改名称以及值;动态删除
3,动态增加、删除属性,遍历、读取属性名称以及值 背景: tinyxml对xml操作的接口过于分散,为了适应自己的需要,对常用的接口进行简单的封
装,各个接口增加注释,方便使用。 环境: WinXP+VC6
修改: 仇军利 EMAIL:282881515@163.COM QQ:282881515
版本: 2012-12-28 V1.0
发布: CSDN
******************************************************************************/
class CUDXmlAttribute
{
public:
CUDXmlAttribute() { m_pAttribute=NULL ; }
CUDXmlAttribute( TiXmlAttribute *pAttribute){ m_pAttribute=pAttribute; } // 下一个属性
CUDXmlAttribute Next();
// 前一个属性
CUDXmlAttribute Pre(); // 返回属性名称
string Name();
// 设置属性名称
void SetName(const char* name); // 返回属性值string类型
string Value();
// 返回属性值int类型
int IntValue();
// 返回属性值double类型
double DoubleValue();
// 设置属性值
void SetValue(const char* value); private:
TiXmlAttribute *m_pAttribute;
}; class CUDXmlNodePtr
{
public:
CUDXmlNodePtr() { m_pElement=NULL; }
CUDXmlNodePtr(TiXmlElement *pElement) { m_pElement=pElement; }
CUDXmlNodePtr(TiXmlNode* pNode) { m_pElement=pNode->ToElement(); }
BOOL operator==(CUDXmlNodePtr&node); // 添加新的节点
CUDXmlNodePtr NewChild(const char* name);
// 获取第一个孩子节点,默认返回第一个孩子节点
CUDXmlNodePtr GetFirstChild(const char* name=NULL);
// 获取下一个兄弟节点,默认返回下边第一个兄弟节点
CUDXmlNodePtr NextSibling(const char* name=NULL);
// 获取上一个兄弟节点,默认返回上边第一个兄弟节点
CUDXmlNodePtr PreSibling(const char* name=NULL);
// 自我销毁
BOOL Destory();
// 销毁所有孩子节点
void DestoryAllChildren(); // 设置属性
void SetAttribute(const char* name, const char* value);
// 读取属性值
string GetAttribute(const char* name);
CUDXmlAttribute GetFirstAttribute();
CUDXmlAttribute LastAttribute(); // 设置节点名称
void SetName(const char*name);
// 获取节点名称
string GetName(); // 设置节点值
void SetValue(const char* value);
// 获取节点值
string GetValue(); // 判断该节点是否为空
BOOL IsNull();
// 返回根节点
CUDXmlNodePtr Root(); public:
TiXmlElement *m_pElement;
}; class CUDXml
{
public:
// 创建xml文件 默认声明为<?xml version="1.0" encoding="UTF-8" standalone="no"?>
BOOL CreateXml(const char* path, const char* version="1.0", const char* encoding="UTF-8", const char* standalone="no"); // 打开文件
BOOL Open(const char* path); // 保存文件
BOOL Save(const char* path=NULL); // 获取根节点
CUDXmlNodePtr GetRoot(); // 判断该文件是否存在
BOOL IsExist(const char* path); private: TiXmlDocument m_doc;
};
#endif
.cpp文件
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include "UDXml.h"
#include <io.h> BOOL CUDXml::CreateXml(const char* path, const char* _version /*="1.0" */, const char* _encoding /*="UTF-8" */, const char* _standalone/*="no" */ )
{
m_doc.LoadFile(path, TIXML_ENCODING_UTF8); TiXmlNode *pDelar = new TiXmlDeclaration(_version, _encoding, _standalone);
m_doc.InsertEndChild(*pDelar);delete pDelar; TiXmlNode *pRoot = new TiXmlElement("root");
m_doc.InsertEndChild(*pRoot); return TRUE;
} BOOL CUDXml::Open( const char* path )
{
return m_doc.LoadFile(path, TIXML_ENCODING_UTF8);
} BOOL CUDXml::Save(const char* path)
{
BOOL ret; if(NULL == path) ret = m_doc.SaveFile();
else ret = m_doc.SaveFile(path); return ret;
} CUDXmlNodePtr CUDXml::GetRoot()
{
return m_doc.RootElement();
} BOOL CUDXml::IsExist( const char* path )
{
if(- != _access(path, ))
return TRUE;
else
return FALSE;
} CUDXmlNodePtr CUDXmlNodePtr::NewChild( const char* name )
{
CUDXmlNodePtr NewNode;
TiXmlNode *pNode = new TiXmlElement(name); NewNode = m_pElement->InsertEndChild(*pNode); delete pNode;
return NewNode;
} BOOL CUDXmlNodePtr::IsNull()
{
return NULL==m_pElement;
} void CUDXmlNodePtr::SetAttribute( const char* name, const char* value )
{
m_pElement->SetAttribute(name, value);
} std::string CUDXmlNodePtr::GetAttribute( const char* name )
{
return m_pElement->Attribute(name);
} void CUDXmlNodePtr::SetName( const char*name )
{
m_pElement->SetValue(name);
} std::string CUDXmlNodePtr::GetName()
{
const char *pName = m_pElement->Value();
if(NULL == pName)
return ""; return pName;
} void CUDXmlNodePtr::SetValue( const char* value )
{
TiXmlNode *pText = new TiXmlText(value);
m_pElement->InsertEndChild(*pText);
delete pText;
} std::string CUDXmlNodePtr::GetValue()
{
const char* pText = m_pElement->GetText();
if(NULL == pText)
return ""; return pText;
} CUDXmlNodePtr CUDXmlNodePtr::GetFirstChild( const char* name/*=NULL*/ )
{
if(NULL == name)
return m_pElement->FirstChildElement();
else
return m_pElement->FirstChildElement(name);
} CUDXmlNodePtr CUDXmlNodePtr::NextSibling( const char* name/*=NULL*/ )
{
if(NULL == name)
return m_pElement->NextSiblingElement();
else
return m_pElement->NextSiblingElement(name);
} CUDXmlNodePtr CUDXmlNodePtr::PreSibling( const char* name/*=NULL*/ )
{
if(NULL == name)
return m_pElement->PreviousSibling();
else
return m_pElement->PreviousSibling(name);
} BOOL CUDXmlNodePtr::Destory()
{
if(*this == Root())return FALSE; return m_pElement->Parent()->RemoveChild((TiXmlNode*)m_pElement);
} CUDXmlNodePtr CUDXmlNodePtr::Root()
{
TiXmlElement *pElement = m_pElement;
TiXmlElement *pRoot = NULL; int nType = pElement->Type();
while ( != nType)
{
pRoot = pElement;
pElement = (TiXmlElement*)pElement->Parent();
nType = pElement->Type();
} return pRoot;
} BOOL CUDXmlNodePtr::operator==( CUDXmlNodePtr&node )
{
return this->m_pElement == node.m_pElement;
} void CUDXmlNodePtr::DestoryAllChildren()
{
m_pElement->Clear();
} CUDXmlAttribute CUDXmlNodePtr::GetFirstAttribute()
{
return m_pElement->FirstAttribute();
} CUDXmlAttribute CUDXmlNodePtr::LastAttribute()
{
return m_pElement->LastAttribute();
} CUDXmlAttribute CUDXmlAttribute::Next()
{
return m_pAttribute->Next();
} CUDXmlAttribute CUDXmlAttribute::Pre()
{
return m_pAttribute->Previous();
} std::string CUDXmlAttribute::Name()
{
return m_pAttribute->Name();
} std::string CUDXmlAttribute::Value()
{
return m_pAttribute->Value();
} void CUDXmlAttribute::SetName( const char* name )
{
m_pAttribute->SetName(name);
} void CUDXmlAttribute::SetValue( const char* value )
{
m_pAttribute->SetValue(value);
} double CUDXmlAttribute::DoubleValue()
{
return m_pAttribute->DoubleValue();
} int CUDXmlAttribute::IntValue()
{
return m_pAttribute->IntValue();
}
2014-11-1118:17:15
读取邮件FolderMap.xml自定义TinyXmlDll动态库
#ifdef XMLDLL_EXPORTS
#define XMLDLL_API __declspec(dllexport)
#else
#define XMLDLL_API __declspec(dllimport)
#endif #include "xml\tinyxml.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string> using namespace std; namespace ParserXml{ class CPaserXml
{
public: /*获取节点值
*param domain_name 邮箱服务器域名
*param folder_name 文件夹名字
* 根据需求 return 文件夹名称(编码为UTF-8)
*/
static XMLDLL_API std::string GetValue(const char* domain_name,const char* folder_name,const char* filname="FolderMap.xml"); private:
// 判断该文件是否存在
static XMLDLL_API BOOL IsExist(const char* path); // 返回xml路径
static XMLDLL_API string GetAppPath(const char* filename); // 宽字符转到Ansi
static XMLDLL_API std::string WChar2Ansi(LPCWSTR pwszSrc); // GB2312转到UTF-8
static XMLDLL_API std::string GB2312ToUTF8(const char* gb2312); // UTF-8转到GB2312
static XMLDLL_API std::string UTF8ToGB2312(const char* utf8);
}; }//namespace ParserXml
#include "ParserXml.h"
#include <io.h>
#include <atlstr.h> namespace ParserXml{ std::string CPaserXml::GetValue(const char* domain_name,const char* folder_name,const char* filname/*="FolderMap.xml"*/)
{
std::string NameValue; string xmlname = GetAppPath(filname); if (IsExist(xmlname.c_str()))
{
TiXmlDocument Document(xmlname.c_str()); if(Document.LoadFile())
{
TiXmlElement* root = Document.RootElement();
if (root)
{
TiXmlNode* item = root->FirstChild(domain_name); if (item)
{
TiXmlNode* child = item->FirstChild(GB2312ToUTF8(folder_name).c_str()); TiXmlElement* IDElement = child->ToElement()->FirstChildElement(); TiXmlElement* NameElement = IDElement->NextSiblingElement(); const char* name = NameElement->GetText(); NameValue = name;
}
}
}
} return NameValue;
} BOOL CPaserXml::IsExist(const char* path)
{
if(- != _access(path, ))
return TRUE;
else
return FALSE;
} string CPaserXml::GetAppPath(const char* filename)
{
//获取应用程序根目录 TCHAR modulePath[MAX_PATH];
GetModuleFileName(NULL, modulePath, MAX_PATH);
CString strModulePath(modulePath);
strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\'))); string strPath= WChar2Ansi(strModulePath.GetBuffer()); string seperator = "\\"; string fullPath = strPath +seperator+filename; return fullPath;
} std::string CPaserXml::WChar2Ansi(LPCWSTR pwszSrc)
{
int nLen = WideCharToMultiByte(CP_ACP, , pwszSrc, -, NULL, , NULL, NULL);
if (nLen<= ) return std::string("");
char* pszDst = new char[nLen];
if (NULL == pszDst) return std::string("");
WideCharToMultiByte(CP_ACP, , pwszSrc, -, pszDst, nLen, NULL, NULL);
pszDst[nLen -] = ;
std::string strTemp(pszDst);
delete [] pszDst;
return strTemp;
} std::string CPaserXml::GB2312ToUTF8(const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, , gb2312, -, NULL, ); wchar_t* wstr = new wchar_t[len+]; memset(wstr, , len+); MultiByteToWideChar(CP_ACP, , gb2312, -, wstr, len); len = WideCharToMultiByte(CP_UTF8, , wstr, -, NULL, , NULL, NULL); char* str = new char[len+]; memset(str, , len+); WideCharToMultiByte(CP_UTF8, , wstr, -, str, len, NULL, NULL); if(wstr) delete[] wstr; string temp = str;
return temp;
} std::string CPaserXml::UTF8ToGB2312(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, , utf8, -, NULL, ); wchar_t* wstr = new wchar_t[len+]; memset(wstr, , len+); MultiByteToWideChar(CP_UTF8, , utf8, -, wstr, len); len = WideCharToMultiByte(CP_ACP, , wstr, -, NULL, , NULL, NULL); char* str = new char[len+]; memset(str, , len+); WideCharToMultiByte(CP_ACP, , wstr, -, str, len, NULL, NULL);
if(wstr) delete[] wstr; string temp = str;
return temp;
} }//namespace ParserXml
C++使用TinyXML的更多相关文章
- C++ tinyXML使用
tinyXML下载: http://sourceforge.net/projects/tinyxml/ 加载到项目: 这六个文件添加到你的c++工程中,分别是tinystr.h.tinystr.cpp ...
- tinyXML的用法
tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,和apache的Dom4j可以披靡啊!习惯了使用java类库的我看到这么丰富的c++类库,很高兴!它使用很简单,只需要拷贝几个文件到你 ...
- tinyxml一个优秀的C++ XML解析器
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...
- C++库(TinyXML)
C++库(TinyXML) 什么是XML? "当 XML(扩展标记语言)于 1998 年 2 月被引入软件工业界时,它给整个行业带来了一场风暴.有史以来第一次,这个世界拥有了一种用来结构化文 ...
- tinyXML的用法,用于解析gpx文件
tinyxml是一个开源的C++xml解析工具集,简单.轻量而又高效,所以对于处理xml文件是一个非常不错的选择. 由于它开源,所以可以方便地免费下载,下载地址百度一下很容易找到,这里就不多说了. 下 ...
- tinyxml学习4
tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,和apache的Dom4j可以披靡啊!习惯了使用java类库的我看到这么丰富的c++类库,很高兴!它使用很简单,只需要拷贝几个文件到你 ...
- tinyxml学习5
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...
- tinyxml学习一
在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类. TiXmlAttribute:对应于XML中的元素的属性. ...
- tinyxml学习2
在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类. TiXmlAttribute:对应于XML中的元素的属性. TiXmlNode:对应于DO ...
- TinyXML:一个优秀的C++ XML解析器
//-------------------------------------------------------------------------------------------------- ...
随机推荐
- 网站编辑须知9个SEO技巧
1. 文章当中最好需要出现一个网站核心关键词所谓的网站核心的关键词就是指与网站内容相关性比较高并且是比较受欢迎的关键词,当然还有相当高的转化率 2. 文章标题当中需要出现关键词.关键字在标题标签< ...
- Django单元测试简单示例
对一个功能的验证往往是需要很多多测试用例,可以把测试用例集合在一起执行,这就产生了测试套件TestSuite 的概念,它是用来组装单个测试用例,规定用例的执行的顺序,而且TestSuite也可以嵌套T ...
- 【剑指offer】栈的压入、弹出序列
一.题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该 ...
- vue学习之五生命周期
一.vue生命周期图解 下图展示了实例的生命周期.你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高. 二.vue钩子函数使用 2.1beforeCreate 在实例初始 ...
- js定位当前位置的坐标经纬度和地点名称和天气
<script src="http://api.map.baidu.com/api?v=2.0&ak=s6vFvPKgaEnI2ImqBpKGDj0m">< ...
- Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
https://blog.csdn.net/shinesun001/article/details/54312402 在centos 7环境下搭建好Lnmp环境之后,发现安装的php有好多扩展都没有安 ...
- [py][mx]django城市-教学机构-教师模型设计
分析下城市-教学机构-教师模型设计 CourseOrg 课程信息 Teacher 教师信息 CityDict 城市信息 代码 from datetime import datetime from dj ...
- loadrunner 接口性能脚本编写(Get请求和Post请求)
前段时间接触了一下loadrunner的接口性能测试,然后尝试了一下手动编写脚本,毕竟录制这种东西,不是每次都能通的,而且录制下来的脚本,通常是有很多其他杂七杂八的请求夹杂在中间,没有达到真正的压测接 ...
- http协议基础(二)请求和响应报文的构成
http协议用于客户端和服务器之间的通信,请求访问资源的一方称为客户端,而提供资源响应的一方称为服务器端. 下面就是客户端和服务端之间简单的通信过程 PS:请求必须从客户端建立通信,服务端没收到请求之 ...
- springmvc学习笔记一框架的理解
SpringMVC现在在很多公司都很流行,所以这个框架对我们来说,是很重要的. 首先我们对比mvc来分析springmvc这个框架是怎么设计,以及它的工作的流程. 首先来看mvc: 1. 用户发起r ...