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. UILabel 的属性设置

    .设置字体样式(加粗) label.font = [UIFont boldSystemFontOfSize:30]; 6.设置字体类型 label.font = [UIFont fontWithNam ...

  2. ubuntu切换到超级管理员权限

    默认情况下是无法切换的,需要给root用户设置上密码 mars@mars-LIFEBOOK-LH531:~$ sudo passwd root[sudo] password for mars: 输入新 ...

  3. C - 哗啦啦村的扩建

    C - 哗啦啦村的扩建 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 512000/256000KB (Java/Others) Sub ...

  4. 实验六 多线程编程 1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。

    //继承Thread类 package zuoye; //继承Thread类 public class City extends Thread{ private String name; public ...

  5. javascript performence

    1.将脚本放在底部 javascript是阻塞式的加载,如果先加载脚本,后面的dom都没有办法进行渲染,页面会是一片空白: 采用无阻塞下载javascript a.使用<script>标签 ...

  6. laravel 邮箱改密功能

    参考网址: http://laravelacademy.org/post/1290.html

  7. VS2013程序打包部署详细图解

      目录(?)[+]   新建项目 FILE –> New –> Project,如下图所示:  注意:如果 InstallShield Limited Edition Project 显 ...

  8. windows下如何快速搭建web.py开发框架

    在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方 ...

  9. CDN技术详解及实现原理

    CDN技术详解 一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精 ...

  10. 深入浅出requireJS-1

    我们都知道,虽然我们可以通过原型和继承来使javascript面向对象.但是,当js代码和逻辑过多时,代码的维护和扩展会变的很不方便.这时,nodejs做的非常好,但是在浏览器端模块化的js编程一直都 ...