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的更多相关文章

  1. C++ tinyXML使用

    tinyXML下载: http://sourceforge.net/projects/tinyxml/ 加载到项目: 这六个文件添加到你的c++工程中,分别是tinystr.h.tinystr.cpp ...

  2. c#生成静态html文件,封装类

    由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设 ...

  3. 自动创建WIN32下多级子目录的C++封装类

            这是 WIN32 自动创建多级子目录的 C++ 封装类,用法简单.         封装没有采用类的静态函数方式,而是在构造函数里面直接完成工作.没什么具体的原因,只是当时做成这样了, ...

  4. StackExchange.Redis 访问封装类

    最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或 ...

  5. StackExchange.Redis通用封装类分享(转)

    阅读目录 ConnectionMultiplexer 封装 RedisHelper 通用操作类封 String类型的封装 List类型的封装 Hash类型的封装 SortedSet 类型的封装 key ...

  6. 【MongoDB】 基于C#官方驱动2.2版的封装类

    一.前言 最近项目中要用到MongoDB,因此实现做了不少的调研.发现网上很多现有关于MongoDB C#官方驱动的调用方法都是基于1.8版本的,已经不是用了最新的2.2版本.因此我在基于C#官方驱动 ...

  7. tinyXML的用法

    tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,和apache的Dom4j可以披靡啊!习惯了使用java类库的我看到这么丰富的c++类库,很高兴!它使用很简单,只需要拷贝几个文件到你 ...

  8. tinyxml一个优秀的C++ XML解析器

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...

  9. 小心Java中封装类的值比较

    一般我们使用数值时,都是使用基本类型,如int.long等,但如果你喜欢使用Integer.Long的包装类,那有一点可就得注意了.先来看下这段代码: /** * * @author trytocat ...

随机推荐

  1. JS的一些常见验证代码

    1//檢查空串  2function isEmpty(str){  3 if((str == null)||(str.length == 0)) return (true);  4 else retu ...

  2. 各硬件设备在Linux中的文件名

  3. Android 安装镜像

    1. 关机 2. 按住音量减键和电源键,直到进入fastboot模式 3. 连接上PC 4. PC端输入sudo fastboot devices验证已识别到设备 5. PC端输入sudo fastb ...

  4. Docker 制作mysql镜像

    # 拉取Ubuntu镜像 docker pull docker.io/ubuntu: # 运行一个容器 docker run --name mysql -p 33:3306 -v /mysql:/va ...

  5. 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)

    在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...

  6. OMCS开发手册(03) -- 多媒体服务器

    前面我们已经详细介绍了基于OMCS开发网络多媒体应用的客户端程序所必需掌握的内容,现在我们来看一下OMCS服务端的开发.对于使用者而言,OMCS的服务端就非常简单了,只要实现一个用户验证的接口,挂接到 ...

  7. ashx入侵

    <%@ WebHandler Language="C#" Class="TextLd" %>using System;using System.Co ...

  8. Vultr VPS测试IP $5/月KVM-512MB/15G SSD/1T

    vultr主要卖点是:SSD硬盘.超低价格.全球13个机房.10Gb服务器带宽.3GHz CPU.性能优异.vultr vps详细评测可参考这篇文章. 以下是vutlr vps官方提供的测试IP地址: ...

  9. mysql建表设置两个默认CURRENT_TIMESTAMP的技巧

    转载:http://blog.163.com/user_zhaopeng/blog/static/166022708201252323942430/   业务场景: 例如用户表,我们需要建一个字段是创 ...

  10. 关于oracle数据库(10)函数

    分析函数,用于统计排名 语法:函数名() over(order by 排序字段 asc | desc) row_number() 无论值是否相等,生成连续的行号 -- 1,2,3,4, select ...