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();