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. Python之线程&进程

    线程: 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. thr ...

  2. storm.yaml 配置项

    配置项 配置说明 storm.zookeeper.servers ZooKeeper服务器列表 storm.zookeeper.port ZooKeeper连接端口 storm.local.dir s ...

  3. HUST 1404 Hamming Distance(字符串)

    Hamming Distance Description Have you ever heard of the Hamming distance. It is the number of positi ...

  4. webapi中使用Route标签

    Prior to Web API 2, the Web API project templates generated code like this: protected void Applicati ...

  5. redis数据类型:sets

    sets类型及操作: set是集合,它是string类型的无序集合.set是通过hash table实现的, 添加.删除和查找的复杂度都是O(1).对集合我们可以取并集.交集.差集. 通过这些操作我们 ...

  6. Bmob Androidstudio配置

    AndroidStudio配置 鉴于目前Google官方推荐使用 Android Studio 进行Android项目开发,自 V3.4.2 开始,Bmob Android SDK 可以使用Gradl ...

  7. CentOS中文件夹基本操作命令

    摘自:http://www.centoscn.com/CentOS/help/2013/1024/1967.html 文件(夹)查看类命令 ls--显示指定目录下内容 说明:ls 显示结果以不同的颜色 ...

  8. html 图片上传预览

    Html5 upload img 2012年12月27日 20:36 <!DOCTYPE HTML> <html> <head> <meta http-equ ...

  9. KVM 虚拟化基本搭建

    KVM虚拟化技术 KVM是基于x86架构上Linux操作系统的全虚拟化解决方案 ,在Centos6.3系统中,kvm已经被集成到内核中,相当于使用内核来做虚拟机管理程序.由于KVM本身就工作于内核环境 ...

  10. Compile Time Assertion..

    The most seen assertion are during runtime, but this one is at compile time, to give the error more ...