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解析器
//-------------------------------------------------------------------------------------------------- ...
随机推荐
- HTML_body标签
常用符号:空格:  大于号:> 小于号: < 块级标签:H标签(加大加粗),P标签(段落间有间距),DIV(白板) 行内标签:SPAN标签(白板) <!- ...
- Making the Grade---poj3666(dp)
题目链接:http://poj.org/problem?id=3666 题意:有一个n个数的序列a,现在要把这些序列变成单调增的或者单调减的序列 b , 其价值为|A1 - B1| + |A2 - B ...
- J - Fire!---UVA 11624
题目链接 题意:J代表Joe的位置,F代表火的起点,下一刻火将会向四周扩散,求Joe逃离的最短时间,如果不能逃离输出IMPOSSIBLE; 注意火的起点可能不止一处 可以用两次bfs分别求出人到达某个 ...
- 洛谷P3557 GRA-Tower Defense Game [POI2013] 构造
正解:构造 解题报告: 传送门 话说这题我理解题意理解了好久TT一直没懂那个,k的意义是什么,,,后来才明白,可能k就是没有意义的趴 (upd:好像明白辣,k是用来保证这么做是对的QwQ 然后就直接港 ...
- IO流(8)递归删除带文件的目录
递归删除带内容的目录 * * 目录给定:demo * * 分析: * A:封装目录 * B:获取该目录下的所有文件或者文件夹的File数组 * C:遍历该File数组,得到每一个File对象 * D: ...
- 便于理解mysql内幕的各种逻辑图组
便于理解mysql内幕的各种逻辑图组 http://blog.sina.com.cn/s/blog_445e807b0101ggtl.html 以下是个人一直以来从网络等各种途径收集到的一些对理解my ...
- 一行代码彻底禁用WordPress缩略图自动裁剪功能
记得在博客分享七牛缩略图教程的时候,提到过 WordPress 默认会将上传的图片裁剪成多个,不但占用磁盘空间,也会拖慢网站性能,相当闹心! 当时也提到了解决办法: ①.关闭主题自带缩略图裁剪功能(若 ...
- 申请 Let’s Encrypt 泛域名证书 及 Nginx/Apache 证书配置
什么是 Let’s Encrypt? 部署 HTTPS 网站的时候需要证书,证书由 CA (Certificate Authority )机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于 ...
- python的三种字符串格式化方法
1.最方便的 print 'hello %s and %s' % ('df', 'another df') 但是,有时候,我们有很多的参数要进行格式化,这个时候,一个一个一一对应就有点麻烦了,于是就有 ...
- linux命令:linux权限管理命令
权限管理命令 文件的权限只有你两个人可以更改,一个是root,一个是文件所有者. 命令名称:chmod 命令英文原意:change the permissions mode of a file ...