Tinyxml封装类COperatorXml
OperatorXml.h头文件
#ifndef _OPERATOR_XML_H_
#define _OPERATOR_XML_H_ #include <string> class TiXmlDocument;
class TiXmlElement;
class TiXmlDeclaration; class COperaotrXml
{
public:
//////////////////////////////////////////////////////////////////////////
// 操作类型:
// OperatorTypeNone,无类型
// OperatorTypeFirstChild,第一个子元素
// OperatorTypeNextChild,下一个子元素
//////////////////////////////////////////////////////////////////////////
enum OperatorType
{
OperatorTypeNone = 0,
OperatorTypeFirstChild,
OperatorTypeNextChild,
}; //////////////////////////////////////////////////////////////////////////
// 函数功能:
// UTF-8转Unicode
//////////////////////////////////////////////////////////////////////////
static bool UTF8ToUnicode(const std::string& strUTF8, std::wstring* pStrUnicode); //////////////////////////////////////////////////////////////////////////
// 函数功能:
// Unicode转UTF-8
//////////////////////////////////////////////////////////////////////////
static bool UnicodeToUTF8(const std::wstring& strUnicode, std::string* pStrUTF8); //////////////////////////////////////////////////////////////////////////
// 函数功能:
// Unicode转ASCII
//////////////////////////////////////////////////////////////////////////
static bool UnicodeToASCII(const std::wstring& strUnicode, std::string* pStrASCII); public:
COperaotrXml(); ~COperaotrXml(); public:
//////////////////////////////////////////////////////////////////////////
// 函数功能:
// 设置声明
// 输入参数:
// strVersion,版本("1.0")
// strEncoding,编码("UTF-8")
// strStandalone,是否独立("yes"或"no")
// 返回值:
// true,成功;false,失败
//////////////////////////////////////////////////////////////////////////
bool SetDeclaration(const std::wstring& strVersion,
const std::wstring& strEncoding,
const std::wstring& strStandalone); //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 获取声明
//////////////////////////////////////////////////////////////////////////
TiXmlDeclaration* GetDeclaration(); //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 添加元素
// 输入参数:
// strName,元素标签名
// 返回值:
// true,成功;false,失败
//////////////////////////////////////////////////////////////////////////
bool AddElement(const std::wstring& strName); //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 添加元素
// 输入参数:
// strName,元素标签名
// strText,元素内容
// 返回值:
// true,成功;false,失败
//////////////////////////////////////////////////////////////////////////
bool AddElement(const std::wstring& strName, const std::wstring& strText); //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 查找元素
// 输入参数:
// strName,元素标签名
// 返回值:
// true,成功;false,失败
//////////////////////////////////////////////////////////////////////////
bool FindElement(const std::wstring& strName) const; //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 得到元素内容
//////////////////////////////////////////////////////////////////////////
std::wstring GetText() const; //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 加载文件
//////////////////////////////////////////////////////////////////////////
bool Load(const std::wstring& strFileName); //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 保存为文件
//////////////////////////////////////////////////////////////////////////
bool Save(const std::wstring& strFileName); //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 进入某个元素
//////////////////////////////////////////////////////////////////////////
void Into(); //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 跳出某个元素
//////////////////////////////////////////////////////////////////////////
void Out(); private:
//禁止拷贝操作
COperaotrXml(const COperaotrXml&); //禁止赋值操作
COperaotrXml& operator =(const COperaotrXml&); private:
mutable TiXmlElement* m_pCurrentElement;//当前元素 mutable TiXmlElement* m_pChildElement;//子元素 TiXmlDocument* m_pXmlDoc;//xml文档 mutable OperatorType m_emOperatorType;//操作类型
}; #endif
OperatorXml.cpp源文件
#include "OperatorXml.h"
#include "../../Tinyxml/Tinyxml/tinyxml.h"
#include <windows.h> //////////////////////////////////////////////////////////////////////////
// 由于DLL导出函数接口中使用了非内置类型(如std::string等等),必须使用相同版本
// 的lib和dll库,否则会出现莫名其妙的错误.
//////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
#pragma comment(lib, "../Debug/tinyxml.lib")
#else
#pragma comment(lib, "../Release/tinyxml.lib")
#endif //////////////////////////////////////////////////////////////////////////
// 函数功能:
// UTF-8转Unicode
//////////////////////////////////////////////////////////////////////////
bool COperaotrXml::UTF8ToUnicode(const std::string& strUTF8, std::wstring* pStrUnicode)
{
if (strUTF8.empty() || !pStrUnicode)
{
return false;
} int nLength = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
int nWideLength = nLength - 1; pStrUnicode->resize(nWideLength, L'\0');
MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, &pStrUnicode->at(0), nWideLength); return true;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// Unicode转UTF-8
//////////////////////////////////////////////////////////////////////////
bool COperaotrXml::UnicodeToUTF8(const std::wstring& strUnicode, std::string* pStrUTF8)
{
if (strUnicode.empty() || !pStrUTF8)
{
return false;
} int nLength = WideCharToMultiByte(CP_UTF8, 0, strUnicode.c_str(), -1, NULL, 0, NULL, NULL); pStrUTF8->resize(nLength - 1, '\0');
WideCharToMultiByte(CP_UTF8, 0, strUnicode.c_str(), -1, &pStrUTF8->at(0), nLength - 1, NULL, NULL); return true;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// Unicode转ASCII
//////////////////////////////////////////////////////////////////////////
bool COperaotrXml::UnicodeToASCII(const std::wstring& strUnicode, std::string* pStrASCII)
{
if (strUnicode.empty() || !pStrASCII)
{
return false;
} int nLength = WideCharToMultiByte(CP_ACP, 0, strUnicode.c_str(), -1, NULL, 0, NULL, NULL); pStrASCII->resize(nLength - 1, '\0');
WideCharToMultiByte(CP_ACP, 0, strUnicode.c_str(), -1, &pStrASCII->at(0), nLength - 1, NULL, NULL); return true;
} COperaotrXml::COperaotrXml()
: m_pCurrentElement(NULL),
m_pChildElement(NULL),
m_pXmlDoc(NULL)
{
m_pXmlDoc = new TiXmlDocument;
} COperaotrXml::~COperaotrXml()
{
delete m_pXmlDoc;
m_pXmlDoc = NULL;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 设置声明
// 输入参数:
// pszVersion,版本
// pszEncoding,编码
// pszStandalone,是否独立("yes"或"no")
// 返回值:
// true,成功;false,失败
//////////////////////////////////////////////////////////////////////////
bool COperaotrXml::SetDeclaration(const std::wstring& strVersion,
const std::wstring& strEncoding,
const std::wstring& strStandalone)
{
bool bRet = false; try
{
if (!m_pXmlDoc)
{
bRet = false;
throw bRet;
} TiXmlNode* pNode = NULL;
TiXmlDeclaration* pDecl = NULL;
//获取声明
pNode = m_pXmlDoc->FirstChild();
if (pNode)
{
pDecl = pNode->ToDeclaration();
} std::string _version;
std::string _encoding;
std::string _standalone;
//编码转换
UnicodeToUTF8(strVersion, &_version);
UnicodeToUTF8(strEncoding, &_encoding);
UnicodeToUTF8(strStandalone, &_standalone);
//设置声明
TiXmlDeclaration decl(_version, _encoding,_standalone);
if (pDecl)
{
*pDecl = decl;
}
else
{
if (pNode)
{
m_pXmlDoc->InsertBeforeChild(pNode, decl);
}
else
{
pDecl = new TiXmlDeclaration(decl);
m_pXmlDoc->LinkEndChild(pDecl);
}
}
bRet = true;
}
catch (bool)
{
} return bRet;
} TiXmlDeclaration* COperaotrXml::GetDeclaration()
{
TiXmlDeclaration* pDecl = NULL;
if (m_pXmlDoc)
{
TiXmlElement* pRoot = m_pXmlDoc->RootElement();
if (pRoot)
{
pDecl = pRoot->ToDeclaration();
}
}
return pDecl;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 添加元素
// 输入参数:
// strName,元素标签名
// 返回值:
// true,成功;false,失败
//////////////////////////////////////////////////////////////////////////
bool COperaotrXml::AddElement(const std::wstring& strName)
{
bool bRet = false; try
{
//xml节点元素标签名称必须以字母开头
if (strName.empty() || !m_pXmlDoc || !isalpha(strName[0]))
{
bRet = false;
throw bRet;
} std::string strUTF8;
TiXmlElement* pElem = NULL;
//添加元素
UnicodeToUTF8(strName, &strUTF8);
pElem = new TiXmlElement(strUTF8);
if (m_pCurrentElement)
{
m_pCurrentElement->LinkEndChild(pElem);
}
else if (m_pXmlDoc)
{
m_pXmlDoc->LinkEndChild(pElem);
}
else
{
bRet = false;
throw bRet;
}
m_pChildElement = pElem;
m_emOperatorType = OperatorTypeNextChild;
bRet = true;
}
catch (bool)
{
} return bRet;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 添加元素
// 输入参数:
// strName,元素标签名
// strText,元素内容
// 返回值:
// true,成功;false,失败
//////////////////////////////////////////////////////////////////////////
bool COperaotrXml::AddElement(const std::wstring& strName, const std::wstring& strText)
{
bool bRet = AddElement(strName);
if (bRet)
{
std::string strUTF8;
TiXmlText* pText = NULL;
//添加元素的内容
UnicodeToUTF8(strText, &strUTF8);
pText = new TiXmlText(strUTF8);
if (m_pChildElement)
{
m_pChildElement->LinkEndChild(pText);
}
else
bRet = false;
m_emOperatorType = OperatorTypeNextChild;
}
return bRet;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 查找元素
// 输入参数:
// strName,元素标签名
// 返回值:
// true,成功;false,失败
//////////////////////////////////////////////////////////////////////////
bool COperaotrXml::FindElement(const std::wstring& strName) const
{
bool bRet = false; try
{
//xml节点元素标签名称必须以字母开头
if (strName.empty() || !m_pXmlDoc || !isalpha(strName[0]))
{
bRet = false;
throw bRet;
} std::string strUTF8; UnicodeToUTF8(strName, &strUTF8);
//查找第一个子元素
if (m_emOperatorType == OperatorTypeFirstChild)
{
if (m_pCurrentElement)
{
m_pChildElement = m_pCurrentElement->FirstChildElement(strUTF8);
}
else
{
m_pChildElement = m_pXmlDoc->FirstChildElement(strUTF8);
}
if (m_pChildElement)
{
bRet = true;
m_emOperatorType = OperatorTypeNextChild;
}
}
//查找下一个子元素
else if (m_emOperatorType == OperatorTypeNextChild)
{
if (m_pChildElement)
{
m_pChildElement = m_pChildElement->NextSiblingElement(strUTF8);
}
if (m_pChildElement)
{
bRet = true;
}
}
}
catch (bool)
{
} return bRet;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 得到元素内容
//////////////////////////////////////////////////////////////////////////
std::wstring COperaotrXml::GetText() const
{
std::wstring strText;
const char* pszText = NULL; if (m_pChildElement)
{
pszText = m_pChildElement->GetText();
if (pszText)
{
UTF8ToUnicode(pszText, &strText);//编码转换
}
} return strText;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 加载文件
//////////////////////////////////////////////////////////////////////////
bool COperaotrXml::Load(const std::wstring& strFileName)
{
bool bRet = false; try
{
if (strFileName.empty())
{
bRet = false;
throw bRet;
} std::string name; UnicodeToUTF8(strFileName, &name);
if (m_pXmlDoc)
{
delete m_pXmlDoc;
m_pXmlDoc = NULL;
}
m_pXmlDoc = new TiXmlDocument(name);
bRet = m_pXmlDoc->LoadFile();
m_emOperatorType = OperatorTypeFirstChild;
m_pCurrentElement = NULL;
m_pChildElement = NULL;
}
catch (bool)
{
} return bRet;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 保存为文件
//////////////////////////////////////////////////////////////////////////
bool COperaotrXml::Save(const std::wstring& strFileName)
{
bool bRet = false; try
{
if (strFileName.empty() || !m_pXmlDoc)
{
bRet = false;
throw bRet;
} std::string name;
TiXmlDeclaration* pDecl = GetDeclaration(); if (!pDecl)
{
SetDeclaration(L"1.0", L"UTF-8", L"");
}
UnicodeToUTF8(strFileName, &name);
bRet = m_pXmlDoc->SaveFile(name);
}
catch (bool)
{
} return bRet;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 进入某个元素
//////////////////////////////////////////////////////////////////////////
void COperaotrXml::Into()
{
m_pCurrentElement = m_pChildElement;
m_pChildElement = NULL;
m_emOperatorType = OperatorTypeFirstChild;
} //////////////////////////////////////////////////////////////////////////
// 函数功能:
// 跳出某个元素
//////////////////////////////////////////////////////////////////////////
void COperaotrXml::Out()
{
if (m_pCurrentElement)
{
TiXmlNode* pNode = m_pCurrentElement->Parent(); m_pChildElement = m_pCurrentElement;
if (pNode)
{
m_pCurrentElement = pNode->ToElement();
}
else
{
m_pCurrentElement = NULL;
}
m_emOperatorType = OperatorTypeNextChild;
}
}
使用COperatorXml
COperaotrXml xml;
std::wstring name;
std::wstring val; xml.SetDeclaration(L"1.0", L"UTF-8", L""); name = L"T1";
xml.AddElement(name); xml.Into();
name = L"T1-1";
xml.AddElement(name);
name = L"T1-2";
xml.AddElement(name);
name = L"T1-3";
xml.AddElement(name);
name = L"T1-4";
xml.AddElement(name);
name = L"T1-5";
xml.AddElement(name); xml.Into();
name = L"T1-5-1";
val = L"1";
xml.AddElement(name, val);
name = L"T1-5-2";
val = L"2";
xml.AddElement(name, val);
name = L"T1-5-3";
val = L"3";
xml.AddElement(name, val);
name = L"T1-5-4";
val = L"4";
xml.AddElement(name, val);
name = L"T1-5-5";
val = L"5";
xml.AddElement(name, val);
xml.Out(); name = L"T1-6";
xml.AddElement(name);
name = L"T1-7";
xml.AddElement(name);
xml.Out(); name = L"T2";
xml.AddElement(name); xml.Into();
name = L"T2-1";
xml.AddElement(name);
name = L"T2-2";
xml.AddElement(name);
name = L"T2-3";
xml.AddElement(name);
name = L"T2-4";
xml.AddElement(name);
name = L"T2-5";
xml.AddElement(name);
xml.Out(); name = L"T3";
xml.AddElement(name);
name = L"T4";
xml.AddElement(name);
name = L"T5";
xml.AddElement(name); xml.Into();
name = L"T5-1";
xml.AddElement(name);
name = L"T5-2";
xml.AddElement(name);
name = L"T5-3";
xml.AddElement(name);
name = L"T5-4";
xml.AddElement(name);
name = L"T5-5";
xml.AddElement(name);
xml.Out(); name = L"T6";
xml.AddElement(name); bool bRet = false;
xml.Save(L"3.xml"); xml.Load(L"3.xml"); name = L"T1";
bRet = xml.FindElement(name);
xml.Into(); name = L"T1-1";
bRet = xml.FindElement(name); name = L"T1-5";
bRet = xml.FindElement(name); xml.Into();
name = L"T1-5-1";
bRet = xml.FindElement(name);
val = xml.GetText();
xml.Out();
xml.Out(); name = L"T2";
bRet = xml.FindElement(name); xml.Into();
name = L"T2-1";
bRet = xml.FindElement(name);
name = L"T2-5";
bRet = xml.FindElement(name);
xml.Out(); name = L"T3";
bRet = xml.FindElement(name); name = L"T5";
bRet = xml.FindElement(name); xml.Into();
name = L"T5-1";
bRet = xml.FindElement(name);
name = L"T5-2";
bRet = xml.FindElement(name);
name = L"T5-3";
bRet = xml.FindElement(name);
xml.Into();
name = L"abc";
val = L"abc";
xml.AddElement(name, val);
xml.Out();
xml.Out();
Tinyxml封装类COperatorXml的更多相关文章
- C++ tinyXML使用
tinyXML下载: http://sourceforge.net/projects/tinyxml/ 加载到项目: 这六个文件添加到你的c++工程中,分别是tinystr.h.tinystr.cpp ...
- c#生成静态html文件,封装类
由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设 ...
- 自动创建WIN32下多级子目录的C++封装类
这是 WIN32 自动创建多级子目录的 C++ 封装类,用法简单. 封装没有采用类的静态函数方式,而是在构造函数里面直接完成工作.没什么具体的原因,只是当时做成这样了, ...
- StackExchange.Redis 访问封装类
最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或 ...
- StackExchange.Redis通用封装类分享(转)
阅读目录 ConnectionMultiplexer 封装 RedisHelper 通用操作类封 String类型的封装 List类型的封装 Hash类型的封装 SortedSet 类型的封装 key ...
- 【MongoDB】 基于C#官方驱动2.2版的封装类
一.前言 最近项目中要用到MongoDB,因此实现做了不少的调研.发现网上很多现有关于MongoDB C#官方驱动的调用方法都是基于1.8版本的,已经不是用了最新的2.2版本.因此我在基于C#官方驱动 ...
- tinyXML的用法
tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,和apache的Dom4j可以披靡啊!习惯了使用java类库的我看到这么丰富的c++类库,很高兴!它使用很简单,只需要拷贝几个文件到你 ...
- tinyxml一个优秀的C++ XML解析器
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...
- 小心Java中封装类的值比较
一般我们使用数值时,都是使用基本类型,如int.long等,但如果你喜欢使用Integer.Long的包装类,那有一点可就得注意了.先来看下这段代码: /** * * @author trytocat ...
随机推荐
- soj 2543 完全二叉树
1000. 完全二叉树 Total: 338 Accepted: 81 Time Limit: 1sec Memory Limit:256MB Descr ...
- MAC VIM 自定义主题
先从百度云下载 两个 文件 molokai.vim MacVim-snapshot-73-Mavericks.tbz 把macvim 拖到 应用程序里 ,把 mvim 放到 /bin/ 文件夹里 把 ...
- ios 将彩色照片转化成黑白等几种类型
-(UIImage *)changeColoursImageTograyScaleImage:(UIImage *)anImage type:(int)type { CGImageRef imageR ...
- onmousedown活用之碰撞效果
通过绝对定位,在页面中随意位置设置两个div; 也就是说div 是拖动的框,div1和div2是被触碰的框; <!DOCTYPE html> <html> <head&g ...
- Telnet服务器和域名系统的端口号 Mac OS X
找到Telnet服务器和域名系统的端口号: lapommedeMacBook-Pro:~ lapomme$ grep telnet /etc/services telnet /udp # Telnet ...
- COM与.NET程序集导出和部署COM组件
为了分布式和多客户端调用我们还需要将写好的COM组件发布到一台服务器上.这里我们将组件部署到操作系统的COM+应用程序中去.如果没此需要就可以导出后,在C++环境中调用COM了. 第一步:导出COM组 ...
- WebDriver获取table的内容(通过动态获取Table单元格的TagName对其innerHTML值进行获取)
import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedHashMap;import java.util ...
- 二十二、oracle pl/sql分类二 函数
函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句.而在函数体内必须包含return语句返回的数据.我们可以使用create function来建立函数. 1).接下来通过一个案 ...
- ssl证书验证
当我们在访问https网站时,浏览器就会自动下载该网站的SSL证书,并对证书的安全性进行检查. 其他概念不说了,有效期之类的验证也不说了.只说数字证书的真实性和可信性验证. 1.CA下发给网站的证书是 ...
- 【bug】Unable to execute dex: Multiple dex files define
This is a build path issue. Make sure your bin folder is not included in your build path. Right clic ...