【分析总结框架记录】tinyxml库使用

[html]  view plain copy print ?
  1. <span style="font-family: Arial, Helvetica, sans-serif;">tinyxml是c++中用来解析xml的工具库</span>  


  1. #ifndef __ROLE_CAREER_LEVEL_NUMTABLE_H__  
  2. #define __ROLE_CAREER_LEVEL_NUMTABLE_H__  
  3.   
  4. #include "../../../common/tinyxml/tinyxml.h"  
  5. #include "../../../serverinterface/protos/base_structure.pb.h"  
  6. #include <boost/lexical_cast.hpp>   
  7. #include "../../../common/CommonFunc.h"  
  8.   
  9. using namespace std;  
  10. using namespace google::protobuf;  
  11. using namespace zhanjia::net::message;  
  12. using namespace CommonFunc;  
  13.   
  14. class RoleCareerLevelNumTable  
  15. {  
  16. public:  
  17.     RoleCareerLevelNumTable()  
  18.     {  
  19.   
  20.     }  
  21.     ~RoleCareerLevelNumTable()  
  22.     {  
  23.         TypeCareerLevelTemplates::iterator it = _careerLevelTemplates.begin();  
  24.         for (;it != _careerLevelTemplates.end(); it++)  
  25.         {  
  26.             delete *it;  
  27.         }  
  28.           
  29.     }  
  30.   
  31.     void LoadXML()  
  32.     {  
  33.         const char* path = "../../configs/gameserver/role/career_level_numerical_table.xml";  
  34.         bool flag = _doc.LoadFile(path);  
  35.         if (!flag)  
  36.         {  
  37.             LOG(ERROR) << "Error:load " << path << " failed:" << _doc.ErrorDesc();  
  38.             throw new std::exception();         
  39.         }  
  40.     }  
  41.     // 加载career_level_numberical_table.xml到_careerLevelTemplates  
  42.     void ReadCareerLevelAttrToTemplates()   
  43.     {  
  44.         TiXmlElement *careerXml, *levelXml, *root = _doc.RootElement();  
  45.         TiXmlNode *careerNode, *levelNode;  
  46.         int careerId, attr, maxLevel;  
  47.         const char *attrStr = NULL;  
  48.           
  49.         _maxLevel = CheckAndGetAttributeValue<int>(root, "maxLevel");  
  50.   
  51.         careerNode = root->FirstChild("Career");  
  52.         while (careerNode)  
  53.         {  
  54.             careerXml = careerNode->ToElement();  
  55.             careerId = CheckAndGetAttributeValue<int>(careerXml, "id");  
  56.   
  57.             levelNode = careerXml->FirstChild("Level");  
  58.               
  59.             while (levelNode)  
  60.             {  
  61.                 levelXml = levelNode->ToElement();  
  62.                 PbMsgRoleInfo* roleInfo = new PbMsgRoleInfo();  
  63.                 roleInfo->set_careerid(careerId);  
  64.   
  65.                 attr = CheckAndGetAttributeValue<int>(levelXml, "value");  
  66.                 roleInfo->set_level(attr);  
  67.   
  68.                 attr = CheckAndGetAttributeValue<int>(levelXml, "strength");  
  69.                 roleInfo->set_strength(attr);  
  70.   
  71.                 attr = CheckAndGetAttributeValue<int>(levelXml, "agile");  
  72.                 roleInfo->set_agile(attr);  
  73.                             
  74.                 attr = CheckAndGetAttributeValue<int>(levelXml, "physical");  
  75.                 roleInfo->set_physical(attr);  
  76.   
  77.                 attr = CheckAndGetAttributeValue<int>(levelXml, "lucky");  
  78.                 roleInfo->set_lucky(attr);  
  79.   
  80.                 attr = CheckAndGetAttributeValue<int>(levelXml, "attack");  
  81.                 roleInfo->set_attack(attr);  
  82.   
  83.                 attr = CheckAndGetAttributeValue<int>(levelXml, "defensive");  
  84.                 roleInfo->set_defensive(attr);  
  85.   
  86.                 attr = CheckAndGetAttributeValue<int>(levelXml, "hpMax");  
  87.                 roleInfo->set_hpmax(attr);  
  88.   
  89.                 attr = CheckAndGetAttributeValue<int>(levelXml, "accuracy");  
  90.                 roleInfo->set_accuracy(attr);  
  91.   
  92.                 attr = CheckAndGetAttributeValue<int>(levelXml, "dodge");  
  93.                 roleInfo->set_dodge(attr);  
  94.   
  95.                 attr = CheckAndGetAttributeValue<int>(levelXml, "crit");  
  96.                 roleInfo->set_crit(attr);  
  97.   
  98.                 attr = CheckAndGetAttributeValue<int>(levelXml, "iceAtt");  
  99.                 roleInfo->set_iceatt(attr);  
  100.   
  101.                 attr = CheckAndGetAttributeValue<int>(levelXml, "iceDef");  
  102.                 roleInfo->set_icedef(attr);  
  103.   
  104.                 attr = CheckAndGetAttributeValue<int>(levelXml, "fireAtt");  
  105.                 roleInfo->set_fireatt(attr);  
  106.   
  107.                 attr = CheckAndGetAttributeValue<int>(levelXml, "fireDef");  
  108.                 roleInfo->set_firedef(attr);  
  109.   
  110.                 attr = CheckAndGetAttributeValue<int>(levelXml, "lightAtt");  
  111.                 roleInfo->set_lightatt(attr);  
  112.   
  113.                 attr = CheckAndGetAttributeValue<int>(levelXml, "lightDef");  
  114.                 roleInfo->set_lightdef(attr);  
  115.   
  116.                 attr = CheckAndGetAttributeValue<int>(levelXml, "darkAtt");  
  117.                 roleInfo->set_darkatt(attr);  
  118.   
  119.                 attr = CheckAndGetAttributeValue<int>(levelXml, "darkDef");  
  120.                 roleInfo->set_darkdef(attr);  
  121.   
  122.                 attr = CheckAndGetAttributeValue<int>(levelXml, "speed");  
  123.                 roleInfo->set_speed(attr);  
  124.   
  125.                 attr = CheckAndGetAttributeValue<int>(levelXml, "attSpeed");  
  126.                 roleInfo->set_attspeed(attr);  
  127.   
  128.                 attr = CheckAndGetAttributeValue<int>(levelXml, "expMax");  
  129.                 roleInfo->set_expmax(attr);  
  130.   
  131.                 _careerLevelTemplates.push_back(roleInfo);             
  132.                 levelNode = levelNode->NextSibling("Level");  
  133.             }  
  134.             careerNode = careerNode->NextSibling("Career");  
  135.         }  
  136.   
  137.         if (_careerLevelTemplates.empty())  
  138.         {  
  139.             LOG(ERROR) << "Error:career_level_numerical_table.xml is empty!" ;  
  140.             throw new std::exception();  
  141.         }  
  142.           
  143.     }  
  144.   
  145.     // 加载careerId的Level职业等级信息  
  146.     const PbMsgRoleInfo* LoadCareerLevelAttr(int careerId, int level)  
  147.     {  
  148.         TypeCareerLevelTemplates::iterator it = _careerLevelTemplates.begin();  
  149.         for (;it != _careerLevelTemplates.end(); it++)  
  150.         {  
  151.             // 查找到指定职业和等级的属性信息  
  152.             if (((*it)->careerid() == careerId) && ((*it)->level() == level) )  
  153.             {  
  154.                 return *it;  
  155.             }  
  156.         }  
  157.         LOG(ERROR) <<" Error:Can't find careerId or level! ";  
  158.         return 0;  
  159.     }  
  160.   
  161. private:  
  162.     // 检查属性是否存在且为数字  
  163.     int CheckAttrVaild(const char* attrName, const char* attrStr)  
  164.     {  
  165.         if (!attrStr)  
  166.         {  
  167.             LOG(ERROR) << "Error: "<< attrName <<" is invalid!";  
  168.             throw new std::exception();  
  169.         }  
  170.         try  
  171.         {  
  172.             return boost::lexical_cast<int>(attrStr);  
  173.         }  
  174.         catch (boost::bad_lexical_cast& e)  
  175.         {  
  176.             LOG(ERROR) << "Error:"<< attrName <<" is not number!";   
  177.             throw new std::exception();  
  178.         }  
  179.     }  
  180.   
  181. private:  
  182.     typedef vector<PbMsgRoleInfo*> TypeCareerLevelTemplates;  
  183.     TiXmlDocument _doc;  
  184.     TypeCareerLevelTemplates _careerLevelTemplates;  
  185.     int _maxLevel;  
  186.   
  187. public:  
  188.     inline int getMaxLevel(){return _maxLevel;}  
  189. };  
  190. #endif  

附上xml

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <CareerLevelTable maxLevel="100">  
  3.     <Career id="431100">  
  4.         <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"/>  
  5.         <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"/>  
  6.     </Career>  
  7. </CareerLevelTable>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值