tinyxml库使用

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>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值