zoukankan      html  css  js  c++  java
  • cocos2d-x 中 xml 文件读取

    实现类 CXmlParse

    啥也不说了  直接上硬货  believe yourself   一看就明白

    CXmlParse.h

    #ifndef __C_XML_PARSE__
    #define __C_XML_PARSE__
    
    #include "cocos2d.h"
    
    using namespace cocos2d;
    
    class CXmlParse : public CCObject , public CCSAXDelegator
    {
    public:
        CXmlParse(void);
        ~CXmlParse(void);
    
        static CXmlParse* parseWithFile(const char* tmxFile);
        bool initXmlParse(const char* xmlname);
    
        std::string root_name;
        bool isJumpHeadData;
        //用于记录所有数据
        std::vector<std::string> allData;  
    
        //使用CCSAXDelegator 重写3个回调函数
        void startElement(void *ctx, const char *name, const char **atts);
        void endElement(void *ctx, const char *name);
        void textHandler(void *ctx, const char *s, int len);
    
    private:
        //用来记录每个key前字段
        std::string startXmlElement;
        //用来记录每个key后字段
        std::string endXmlElement;
        //记录每个value的值
        std::string currString;
    };
    #endif //__C_XML_PARSE__


    CXmlParse.cpp

    #include "XmlParse.h"
    
    
    CXmlParse::CXmlParse(void)
    {
    }
    
    
    CXmlParse::~CXmlParse(void)
    {
        for (int i=0; i<allData.size(); ++i)
        {
            allData[i].clear();
        }
        allData.clear();
    }
    
    CXmlParse* CXmlParse::parseWithFile( const char* tmxFile )
    {
        CXmlParse* pRet = new CXmlParse();
        if(pRet->initXmlParse(tmxFile))
        {
            pRet->autorelease();
            return pRet;
        }
        CC_SAFE_DELETE(pRet);
        return NULL;
    }
    
    bool CXmlParse::initXmlParse( const char* xmlname )
    {
        isJumpHeadData = false;
        CCSAXParser _par;
        if(false == _par.init("UTF-8"))
        {
            CCLog("请使用utf-8格式!");
            return false;
        }
        _par.setDelegator(this);
        //获取文件的完整相对路径
        std::string _path = CCFileUtils::sharedFileUtils()->fullPathForFilename(xmlname);
        return _par.parse(_path.c_str());
    }
    
    //开始解析时回调
    void CXmlParse::startElement( void *ctx, const char *name, const char **atts )
    {
        CC_UNUSED_PARAM(ctx);
    
        startXmlElement = (char*)name;
        if (!isJumpHeadData)
        {
            //跳过数据头
            CCLog("-----------跳过 root name");
            isJumpHeadData = true;
            root_name = startXmlElement;
            return;
        }
    }
    
    //结束解析回调
    void CXmlParse::endElement( void *ctx, const char *name )
    {
        CC_UNUSED_PARAM(ctx);
    
        endXmlElement = (char*)name;
        if (endXmlElement==root_name)
        {
            //数据尾
            CCLog("读取 xml 结束");
            isJumpHeadData = false;
            root_name = "";
            return;
        }
    }
    
    //键值对的结束字段
    void CXmlParse::textHandler( void *ctx, const char *s, int len )
    {
        CC_UNUSED_PARAM(ctx);
    
        currString = std::string((char*)s,0,len);
    
        CCString* ccStr = new CCString();
        ccStr->m_sString = currString;
    
        if (root_name!="")
        {
            allData.push_back(currString);
            CCLOG("enter textHandler");
        }
    }


    实现完毕后 , 在你需要的地方 添加如下代码  , 我的是在 HelloWorld.cpp 的  init()函数 中添加的   (别忘了包含头文件 #include "XmlParse.h")

    CXmlParse* parseXml = CXmlParse::parseWithFile("test.xml");
            for(int i=0; i<parseXml->allData.size(); ++i)
            {
                CCLabelTTF* pLab = CCLabelTTF::create(parseXml->allData[i].c_str(),"Arial",20);
                pLab->setPosition(ccp(size.width/2,size.height/3*2-i*20));
                this->addChild(pLab,2);
            }


    哦,差点忘记了  还有个 test.xml 没有上桌呢  不废话了  直接上菜

    <?xml version="1.0" encoding="utf-8"?>
    <TestData>
        <key1>XML</key1>
        <key2>爱国</key2>
        <key3>包容</key3>
        <key4>厚德</key4>
        <key5>载物</key5>
        <key6>Try your best to do things better</key6>
    </TestData>

    简单吧 ,就这样了 ,下面看看结果吧  看看是不是如我们所愿

    那就这样吧 …… 明天还得上班 赶紧看完《七剑》洗洗睡吧,要不明天就起不来了…… 不废话了  走起……

  • 相关阅读:
    [原]零基础学习SDL开发之在Android使用SDL2.0渲染PNG图片
    [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图
    [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图
    LLBLGen Pro ORM 生成器
    ODATA4 及实现
    所见即所得的网页设计工具 Macaw
    Unity 3D ---引擎行业的新宠
    金蝶有关的网站及服务
    Bitcoin 比特币, LTC(litecoin)莱特币,
    SONY 手提 realtek high definition audio driver
  • 原文地址:https://www.cnblogs.com/MrGreen/p/3295476.html
Copyright © 2011-2022 走看看