//GlobalParams_Defination
#include <Windows.h>
#include <map>
#include <vector>
#include <string>
using namespace std;
typedef struct
{
vector<string> v_param;
}_STL_1VEC_PARAM,*_pSTL_1VEC_PARAM;
typedef struct
{
vector<string> v_param;
map<string,string> m_param;
}_STL_1MAP_PARAM,*_pSTL_1MAP_PARAM;
typedef struct
{
vector<string> v_param;
map<string,_STL_1MAP_PARAM> m_param;
}_STL_2MAP_PARAM,*_pSTL_2MAP_PARAM;
typedef struct
{
vector<string> v_param;
map<string,_STL_2MAP_PARAM> m_param;
}_STL_3MAP_PARAM,*_pSTL_3MAP_PARAM;
//TinyxmlEngine.h
#pragma once
#include "tinyxml.h"
#include "GlobalParams_Defination.h"
class CTinyxmlEngine
{
public:
CTinyxmlEngine(void);
virtual ~CTinyxmlEngine(void);
public:
void Erase_Param_1AMP(_STL_1MAP_PARAM&m_param);
void Erase_Param_2AMP(_STL_2MAP_PARAM&m_param);
void Erase_Param_3AMP(_STL_3MAP_PARAM&m_param);
//ReadAttr
bool Read_XML_1Floor_Attr(const char*pszPath,const char*pszNode,_STL_1MAP_PARAM&m_param);
bool Read_XML_1Floor_Attr(const char*pszPath,const char*pszNode,const char*pszNode1,_STL_1MAP_PARAM&m_param);
bool Read_XML_1Floor_Attr(const char*pszPath,const char*pszNode,const char*pszNode1,const char*pszNode2,_STL_1MAP_PARAM&m_param);
bool Read_XML_2Floor_Attr(const char*pszPath,_STL_2MAP_PARAM&m_param);
bool Read_XML_2Floor_Attr(const char*pszPath,const char*pszNode,_STL_2MAP_PARAM&m_param);
bool Read_XML_2Floor_Attr(const char*pszPath,const char*pszNode,const char*pszNode1,_STL_2MAP_PARAM&m_param);
bool Read_XML_3Floor_Attr(const char*pszPath,_STL_3MAP_PARAM&m_param);
bool Read_XML_3Floor_Attr(const char*pszPath,const char*pszNode,_STL_3MAP_PARAM&m_param);
};
//TinyxmlEngine.cpp
#include "TinyxmlEngine.h"
CTinyxmlEngine::CTinyxmlEngine(void)
{
}
CTinyxmlEngine::~CTinyxmlEngine(void)
{
}
void CTinyxmlEngine::Erase_Param_1AMP(_STL_1MAP_PARAM&m_param)
{
m_param.v_param.clear();
m_param.m_param.clear();
}
void CTinyxmlEngine::Erase_Param_2AMP(_STL_2MAP_PARAM&m_param)
{
m_param.v_param.clear();
m_param.m_param.clear();
}
void CTinyxmlEngine::Erase_Param_3AMP(_STL_3MAP_PARAM&m_param)
{
m_param.v_param.clear();
m_param.m_param.clear();
}
/************************************************************************/
/* Read XML Attribute */
/************************************************************************/
/*
<FileRoot>
<Attr1 ip="192.168.0.1" timeout="123.456000"/>
<Attr2 ip="192.168.0.1" timeout="123.456000"/>
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_1Floor_Attr(const char*pszPath,const char*pszNode,_STL_1MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
const char*pszXmlName,*pszXmlValue;
TiXmlElement* p_root = doc.RootElement();
for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName=p_node->Value();
if (strcmp(pszXmlName,pszNode)==0)
{
TiXmlElement*p_element = p_node->ToElement();
for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
{
pszXmlName = p_attribute->Name();
pszXmlValue = p_attribute->Value();
if (NULL!=pszXmlValue)
{
m_param.v_param.push_back(pszXmlName);
m_param.m_param.insert(map<string,string>::value_type(pszXmlName,pszXmlValue));
}
}
break;
}
}
return true;
}
/*
<FileRoot>
<Attr_1Floor>
<Attr1 name="Attr1" x="5" y="15" w="400" h="250"/>
<Attr2 name="Attr2" x="5" y="15" w="400" h="250"/>
</Attr_1Floor>
...
...
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_1Floor_Attr(const char*pszPath,const char*pszNode/*Attr_1Floor*/,const char*pszNode1/*Attr1*/,_STL_1MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
const char*pszXmlName,*pszXmlValue,*pszXmlName1;
TiXmlElement* p_root = doc.RootElement();
for (TiXmlNode* p_node=p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
if (strcmp(pszXmlName,pszNode)==0)
{
TiXmlElement* p_element = p_node->ToElement();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
if (strcmp(pszXmlName,pszNode1)==0)
{
TiXmlElement*p_element = p_node->ToElement();
for (TiXmlAttribute* p_attribute=p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
{
pszXmlName1 = p_attribute->Name();
pszXmlValue = p_attribute->Value();
if (pszXmlValue!=NULL)
{
m_param.v_param.push_back(pszXmlName1);
m_param.m_param.insert(make_pair(pszXmlName1,pszXmlValue));
}
}
}
}
}
}
return true;
}
/*
<FileRoot>
<Floor2>
<Attr_1Floor>
<Attr1 name="Attr1" x="5" y="15" w="400" h="250"/>
<Attr2 name="Attr2" x="5" y="15" w="400" h="250"/>
</Attr_1Floor>
</Floor2>
...
...
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_1Floor_Attr(const char*pszPath,const char*pszNode/*Floor2*/,const char*pszNode1/*Attr_1Floor*/,const char*pszNode2/*Attr1*/,_STL_1MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
const char*pszXmlName,*pszXmlValue,*pszXmlName1;
TiXmlElement* p_root = doc.RootElement();
for (TiXmlNode* p_node=p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
if (strcmp(pszXmlName,pszNode)==0)
{
TiXmlElement* p_element = p_node->ToElement();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
if (strcmp(pszXmlName,pszNode1)==0)
{
TiXmlElement* p_element = p_node->ToElement();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
if (strcmp(pszXmlName,pszNode2)==0)
{
TiXmlElement*p_element = p_node->ToElement();
for (TiXmlAttribute* p_attribute=p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
{
pszXmlName1 = p_attribute->Name();
pszXmlValue = p_attribute->Value();
if (pszXmlValue!=NULL)
{
m_param.v_param.push_back(pszXmlName1);
m_param.m_param.insert(make_pair(pszXmlName1,pszXmlValue));
}
}
}
}
}
}
}
}
return true;
}
/*
<FileRoot>
<Attr1 ip="192.168.0.1" timeout="123.456000"/>
<Attr2 ip="192.168.0.1" timeout="123.456000"/>
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_2Floor_Attr(const char*pszPath,_STL_2MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
const char*pszXmlName,*pszXmlValue,*pszXmlName1;
_STL_1MAP_PARAM m_param1;
TiXmlElement* p_root = doc.RootElement();
for (TiXmlNode* p_node=p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
if (pszXmlName!=NULL)
{
TiXmlElement* p_element = p_node->ToElement();
m_param1.m_param.clear();
m_param1.v_param.clear();
for (TiXmlAttribute* p_attribute=p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
{
pszXmlName1 = p_attribute->Name();
pszXmlValue = p_attribute->Value();
if (pszXmlValue!=NULL)
{
m_param1.v_param.push_back(pszXmlName1);
m_param1.m_param.insert(make_pair(pszXmlName1,pszXmlValue));
}
}
if (!m_param1.v_param.empty())
{
m_param.v_param.push_back(pszXmlName);
m_param.m_param.insert(make_pair(pszXmlName,m_param1));
}
}
}
return true;
}
/*
<FileRoot>
<Attr_1Floor>
<Attr1 name="Attr1" x="5" y="15" w="400" h="250"/>
<Attr2 name="Attr2" x="5" y="15" w="400" h="250"/>
</Attr_1Floor>
...
...
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_2Floor_Attr(const char*pszPath,const char*pszNode,_STL_2MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
const char*pszXmlName,*pszXmlValue,*pszXmlName1;
_STL_1MAP_PARAM m_param1;
TiXmlElement* p_root = doc.RootElement();
for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
if (strcmp(pszXmlName,pszNode)==0)
{
TiXmlElement*p_element = p_node->ToElement();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName=p_node->Value();
TiXmlElement*p_element = p_node->ToElement();
m_param1.m_param.clear();
m_param1.v_param.clear();
for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
{
pszXmlName1 = p_attribute->Name();
pszXmlValue = p_attribute->Value();
if (NULL!=pszXmlValue)
{
m_param1.v_param.push_back(pszXmlName1);
m_param1.m_param.insert(map<string,string>::value_type(pszXmlName1,pszXmlValue));
}
}
if (!m_param1.v_param.empty())
{
m_param.v_param.push_back(pszXmlName);
m_param.m_param.insert(map<string,_STL_1MAP_PARAM>::value_type(pszXmlName,m_param1));
}
}
break;
}
}
return true;
}
/*
<FileRoot>
<Floor2>
<Attr_1Floor>
<Attr1 name="Attr1" x="5" y="15" w="400" h="250"/>
<Attr2 name="Attr2" x="5" y="15" w="400" h="250"/>
</Attr_1Floor>
</Floor2>
...
...
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_2Floor_Attr(const char*pszPath,const char*pszNode/*Floor2*/,const char*pszNode1/*Attr_1Floor*/,_STL_2MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
const char*pszXmlName,*pszXmlValue,*pszXmlName1;
_STL_1MAP_PARAM m_param1;
TiXmlElement* p_root = doc.RootElement();
for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
if (strcmp(pszXmlName,pszNode)==0)
{
TiXmlElement*p_element = p_node->ToElement();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName=p_node->Value();
if (strcmp(pszXmlName,pszNode1)==0)
{
TiXmlElement*p_element = p_node->ToElement();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName=p_node->Value();
TiXmlElement*p_element = p_node->ToElement();
m_param1.m_param.clear();
m_param1.v_param.clear();
for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
{
pszXmlName1 = p_attribute->Name();
pszXmlValue = p_attribute->Value();
if (NULL!=pszXmlValue)
{
m_param1.v_param.push_back(pszXmlName1);
m_param1.m_param.insert(map<string,string>::value_type(pszXmlName1,pszXmlValue));
}
}
if (!m_param1.v_param.empty())
{
m_param.v_param.push_back(pszXmlName);
m_param.m_param.insert(map<string,_STL_1MAP_PARAM>::value_type(pszXmlName,m_param1));
}
}
}
}
break;
}
}
return true;
}
/*
<FileRoot>
<Attr_1Floor>
<Attr1 name="Attr1" x="5" y="15" w="400" h="250"/>
<Attr2 name="Attr2" x="5" y="15" w="400" h="250"/>
</Attr_1Floor>
...
...
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_3Floor_Attr(const char*pszPath,_STL_3MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
const char*pszXmlName,*pszXmlValue,*pszXmlName1,*pszXmlName2;
_STL_1MAP_PARAM m_param1;
_STL_2MAP_PARAM m_param2;
TiXmlElement* p_root = doc.RootElement();
for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
TiXmlElement*p_element = p_node->ToElement();
m_param2.m_param.clear();
m_param2.v_param.clear();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName1=p_node->Value();
TiXmlElement*p_element = p_node->ToElement();
m_param1.m_param.clear();
m_param1.v_param.clear();
for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
{
pszXmlName2 = p_attribute->Name();
pszXmlValue = p_attribute->Value();
if (NULL!=pszXmlValue)
{
m_param1.v_param.push_back(pszXmlName2);
m_param1.m_param.insert(map<string,string>::value_type(pszXmlName2,pszXmlValue));
}
}
if (!m_param1.v_param.empty())
{
m_param2.v_param.push_back(pszXmlName1);
m_param2.m_param.insert(map<string,_STL_1MAP_PARAM>::value_type(pszXmlName1,m_param1));
}
}
if (!m_param2.v_param.empty())
{
m_param.v_param.push_back(pszXmlName);
m_param.m_param.insert(map<string,_STL_2MAP_PARAM>::value_type(pszXmlName,m_param2));
}
}
return true;
}
/*
<FileRoot>
<Floor2>
<Attr_1Floor>
<Attr1 name="Attr1" x="5" y="15" w="400" h="250"/>
<Attr2 name="Attr2" x="5" y="15" w="400" h="250"/>
</Attr_1Floor>
</Floor2>
...
...
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_3Floor_Attr(const char*pszPath,const char*pszNode/*Floor2*/,_STL_3MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
const char*pszXmlName,*pszXmlValue,*pszXmlName1,*pszXmlName2;
_STL_1MAP_PARAM m_param1;
_STL_2MAP_PARAM m_param2;
TiXmlElement* p_root = doc.RootElement();
for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName = p_node->Value();
if (strcmp(pszXmlName,pszNode)==0)
{
TiXmlElement *p_element = p_node->ToElement();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
TiXmlElement*p_element = p_node->ToElement();
m_param2.m_param.clear();
m_param2.v_param.clear();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName1=p_node->Value();
TiXmlElement*p_element = p_node->ToElement();
m_param1.m_param.clear();
m_param1.v_param.clear();
for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
{
pszXmlName2 = p_attribute->Name();
pszXmlValue = p_attribute->Value();
if (NULL!=pszXmlValue)
{
m_param1.v_param.push_back(pszXmlName2);
m_param1.m_param.insert(map<string,string>::value_type(pszXmlName2,pszXmlValue));
}
}
if (!m_param1.v_param.empty())
{
m_param2.v_param.push_back(pszXmlName1);
m_param2.m_param.insert(map<string,_STL_1MAP_PARAM>::value_type(pszXmlName1,m_param1));
}
}
if (!m_param2.v_param.empty())
{
m_param.v_param.push_back(pszXmlName);
m_param.m_param.insert(map<string,_STL_2MAP_PARAM>::value_type(pszXmlName,m_param2));
}
}
}
}
return true;
}
函数调用:
#include <iostream>
#include <string>
#include "TinyxmlEngine.h"
using namespace std;
void Print_m_param1(_STL_1MAP_PARAM m_param1)
{
vector<string>::iterator it = m_param1.v_param.begin();
for (;it!=m_param1.v_param.end();++it)
{
cout<<" "<<*it<<": "<<m_param1.m_param[*it]<<endl;
}
cout<<"================================"<<endl;
}
void Print_m_param2(_STL_2MAP_PARAM m_param2)
{
vector<string>::iterator it = m_param2.v_param.begin();
for (;it!=m_param2.v_param.end();++it)
{
cout<<*it<<":"<<endl;
_STL_1MAP_PARAM m_param1 = m_param2.m_param[*it];
vector<string>::iterator it1 = m_param1.v_param.begin();
for (;it1!=m_param1.v_param.end();++it1)
{
cout<<" "<<*it1<<": "<<m_param1.m_param[*it1]<<endl;
}
cout<<"================================"<<endl;
}
}
void Print_m_param3(_STL_3MAP_PARAM m_param3)
{
vector<string>::iterator it = m_param3.v_param.begin();
for (;it!=m_param3.v_param.end();++it)
{
cout<<*it<<":"<<endl;
_STL_2MAP_PARAM m_param2;
m_param2 = m_param3.m_param[*it];
vector<string>::iterator it = m_param2.v_param.begin();
for (;it!=m_param2.v_param.end();++it)
{
cout<<" "<<*it<<":"<<endl;
_STL_1MAP_PARAM m_param1 = m_param2.m_param[*it];
vector<string>::iterator it1 = m_param1.v_param.begin();
for (;it1!=m_param1.v_param.end();++it1)
{
cout<<" "<<*it1<<": "<<m_param1.m_param[*it1]<<endl;
}
}
cout<<"================================"<<endl;
}
}
int main()
{
CTinyxmlEngine m_engine;
_STL_1MAP_PARAM m_param1;
m_engine.Read_XML_1Floor_Attr("Attr.xml","Attr1",m_param1);
Print_m_param1(m_param1);
m_engine.Erase_Param_1AMP(m_param1);
m_engine.Read_XML_1Floor_Attr("Attr.xml","Attr_1Floor","Attr1",m_param1);
Print_m_param1(m_param1);
m_engine.Erase_Param_1AMP(m_param1);
m_engine.Read_XML_1Floor_Attr("Attr.xml","Floor2","Attr_1Floor","Attr1",m_param1);
Print_m_param1(m_param1);
_STL_2MAP_PARAM m_param2;
m_engine.Read_XML_2Floor_Attr("Attr.xml",m_param2);
Print_m_param2(m_param2);
m_engine.Erase_Param_2AMP(m_param2);
m_engine.Read_XML_2Floor_Attr("Attr.xml","Attr_1Floor",m_param2);
Print_m_param2(m_param2);
m_engine.Erase_Param_2AMP(m_param2);
m_engine.Read_XML_2Floor_Attr("Attr.xml","Floor2","Attr_1Floor",m_param2);
Print_m_param2(m_param2);
_STL_3MAP_PARAM m_param3;
m_engine.Read_XML_3Floor_Attr("Attr.xml",m_param3);
Print_m_param3(m_param3);
m_engine.Erase_Param_3AMP(m_param3);
m_engine.Read_XML_3Floor_Attr("Attr.xml","Floor2",m_param3);
Print_m_param3(m_param3);
return 0;
}
附上读取的xml文件:
<?xml version="1.0" standalone="yes" encoding="utf-8"?>
<FileRoot>
<Attr1 ip="192.168.0.1" timeout="123.456000"/>
<Attr2 ip="192.168.0.1" timeout="123.456000"/>
<Attr_1Floor>
<Attr1 name="Attr1" x="5" y="15" w="400" h="250"/>
<Attr2 name="Attr2" x="5" y="15" w="400" h="250"/>
</Attr_1Floor>
<Floor2>
<Attr_1Floor>
<Attr1 name="Attr1" x="5" y="15" w="400" h="25"/>
<Attr2 name="Attr2" x="5" y="15" w="400" h="25"/>
</Attr_1Floor>
</Floor2>
</FileRoot>
运行结果:
ip: 192.168.0.1
timeout: 123.456000
================================
name: Attr1
x: 5
y: 15
w: 400
h: 250
================================
name: Attr1
x: 5
y: 15
w: 400
h: 25
================================
Attr1:
ip: 192.168.0.1
timeout: 123.456000
================================
Attr2:
ip: 192.168.0.1
timeout: 123.456000
================================
Attr1:
name: Attr1
x: 5
y: 15
w: 400
h: 250
================================
Attr2:
name: Attr2
x: 5
y: 15
w: 400
h: 250
================================
Attr1:
name: Attr1
x: 5
y: 15
w: 400
h: 25
================================
Attr2:
name: Attr2
x: 5
y: 15
w: 400
h: 25
================================
Attr_1Floor:
Attr1:
name: Attr1
x: 5
y: 15
w: 400
h: 250
Attr2:
name: Attr2
x: 5
y: 15
w: 400
h: 250
================================
Floor2:
Attr1:
name: Attr1
x: 5
y: 15
w: 400
h: 25
Attr2:
name: Attr2
x: 5
y: 15
w: 400
h: 25
================================
请按任意键继续. . .