tinyxml是c++中用来解析xml的工具库
#ifndef __ROLE_CAREER_LEVEL_NUMTABLE_H__
#define __ROLE_CAREER_LEVEL_NUMTABLE_H__
#include "../../../common/tinyxml/tinyxml.h"
#include "../../../serverinterface/protos/base_structure.pb.h"
#include <boost/lexical_cast.hpp>
#include "../../../common/CommonFunc.h"
using namespace std;
using namespace google::protobuf;
using namespace zhanjia::net::message;
using namespace CommonFunc;
class RoleCareerLevelNumTable
{
public:
RoleCareerLevelNumTable()
{
}
~RoleCareerLevelNumTable()
{
TypeCareerLevelTemplates::iterator it = _careerLevelTemplates.begin();
for (;it != _careerLevelTemplates.end(); it++)
{
delete *it;
}
}
void LoadXML()
{
const char* path = "../../configs/gameserver/role/career_level_numerical_table.xml";
bool flag = _doc.LoadFile(path);
if (!flag)
{
LOG(ERROR) << "Error:load " << path << " failed:" << _doc.ErrorDesc();
throw new std::exception();
}
}
// 加载career_level_numberical_table.xml到_careerLevelTemplates
void ReadCareerLevelAttrToTemplates()
{
TiXmlElement *careerXml, *levelXml, *root = _doc.RootElement();
TiXmlNode *careerNode, *levelNode;
int careerId, attr, maxLevel;
const char *attrStr = NULL;
_maxLevel = CheckAndGetAttributeValue<int>(root, "maxLevel");
careerNode = root->FirstChild("Career");
while (careerNode)
{
careerXml = careerNode->ToElement();
careerId = CheckAndGetAttributeValue<int>(careerXml, "id");
levelNode = careerXml->FirstChild("Level");
while (levelNode)
{
levelXml = levelNode->ToElement();
PbMsgRoleInfo* roleInfo = new PbMsgRoleInfo();
roleInfo->set_careerid(careerId);
attr = CheckAndGetAttributeValue<int>(levelXml, "value");
roleInfo->set_level(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "strength");
roleInfo->set_strength(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "agile");
roleInfo->set_agile(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "physical");
roleInfo->set_physical(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "lucky");
roleInfo->set_lucky(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "attack");
roleInfo->set_attack(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "defensive");
roleInfo->set_defensive(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "hpMax");
roleInfo->set_hpmax(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "accuracy");
roleInfo->set_accuracy(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "dodge");
roleInfo->set_dodge(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "crit");
roleInfo->set_crit(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "iceAtt");
roleInfo->set_iceatt(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "iceDef");
roleInfo->set_icedef(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "fireAtt");
roleInfo->set_fireatt(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "fireDef");
roleInfo->set_firedef(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "lightAtt");
roleInfo->set_lightatt(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "lightDef");
roleInfo->set_lightdef(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "darkAtt");
roleInfo->set_darkatt(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "darkDef");
roleInfo->set_darkdef(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "speed");
roleInfo->set_speed(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "attSpeed");
roleInfo->set_attspeed(attr);
attr = CheckAndGetAttributeValue<int>(levelXml, "expMax");
roleInfo->set_expmax(attr);
_careerLevelTemplates.push_back(roleInfo);
levelNode = levelNode->NextSibling("Level");
}
careerNode = careerNode->NextSibling("Career");
}
if (_careerLevelTemplates.empty())
{
LOG(ERROR) << "Error:career_level_numerical_table.xml is empty!" ;
throw new std::exception();
}
}
// 加载careerId的Level职业等级信息
const PbMsgRoleInfo* LoadCareerLevelAttr(int careerId, int level)
{
TypeCareerLevelTemplates::iterator it = _careerLevelTemplates.begin();
for (;it != _careerLevelTemplates.end(); it++)
{
// 查找到指定职业和等级的属性信息
if (((*it)->careerid() == careerId) && ((*it)->level() == level) )
{
return *it;
}
}
LOG(ERROR) <<" Error:Can't find careerId or level! ";
return 0;
}
private:
// 检查属性是否存在且为数字
int CheckAttrVaild(const char* attrName, const char* attrStr)
{
if (!attrStr)
{
LOG(ERROR) << "Error: "<< attrName <<" is invalid!";
throw new std::exception();
}
try
{
return boost::lexical_cast<int>(attrStr);
}
catch (boost::bad_lexical_cast& e)
{
LOG(ERROR) << "Error:"<< attrName <<" is not number!";
throw new std::exception();
}
}
private:
typedef vector<PbMsgRoleInfo*> TypeCareerLevelTemplates;
TiXmlDocument _doc;
TypeCareerLevelTemplates _careerLevelTemplates;
int _maxLevel;
public:
inline int getMaxLevel(){return _maxLevel;}
};
#endif
附上xml
<?xml version="1.0" encoding="utf-8"?>
<CareerLevelTable maxLevel="100">
<Career id="431100">
<Level value="1" expMax="100" strength="1" agile="1" physical="1" lucky="1" attack="30" defensive="10" hpMax="140" accuracy="90" dodge="50" crit="15" attSpeed="10" iceAtt="10" fireAtt="10" lightAtt="20" darkAtt="10" iceDef="10" fireDef="10" lightDef="15" darkDef="10" speed="180"/>
<Level value="2" expMax="200" strength="3" agile="3" physical="3" lucky="3" attack="45" defensive="34" hpMax="171" accuracy="90" dodge="50" crit="24" attSpeed="11" iceAtt="15" fireAtt="15" lightAtt="30" darkAtt="15" iceDef="15" fireDef="15" lightDef="23" darkDef="15" speed="180"/>
</Career>
</CareerLevelTable>