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>

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

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

原文地址:https://www.cnblogs.com/MrGreen/p/3295476.html