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>
简单吧 ,就这样了 ,下面看看结果吧 看看是不是如我们所愿
那就这样吧 …… 明天还得上班 赶紧看完《七剑》洗洗睡吧,要不明天就起不来了…… 不废话了 走起……
Dreams are one of those things that keep you going and happy!!!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步