欢迎光临Software MyZone,有问题可留言或到站点论坛发帖,争取第一时间帮忙解决 || 站点论坛:火龙论坛 || 淘宝小店:应小心的易淘屋 【欢迎大家提建设性意见】

有关cocos2d-x的xml文件读取问题

本文为firedragonpzy原创,转载务必在明显处注明:
转载自【Softeware MyZone】原文链接: 
http://www.firedragonpzy.com.cn/index.php/archives/3227

欢迎热爱编程的朋友们参与到cocos2d-x编程中,为了给大家提供良好的交流环境,网站以开启QQ群
Software MyZone:66202765(群号,欢迎加入,若满,请加1群)
Software MyZone 1群(2dx):286504621
【加群请写:Software MyZone或者是firedragonpzy】
群论坛:火龙论坛正试运营阶段,欢迎大家多提些建设性意见……

简介:关于xml文件的读取,大家可以使用自带的CCUserDefault、tinyxml、pugixml来读取,而CCUserDeafult使用的是libxml。注:本文主要来自与群里的朋友南湾探讨tinyxml得来的,自己未亲测
下面一一分述:

关于CCUserDefault:

在使用CCUserDefault读取数据的时候 ,在ios、android、win下面是没有任何问题的,如果想搞明白,自己研究下CCUserDefault与libxml。。。

关于tinyxml:

在使用tinyxml读取数据的时候,使用CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(pFileName)是获取不到路径。这个方法读取不到apk里面的文件。

虽然tinyxml读不了assets中的的数据,但是能读getwriteablepath下的xml,所有我们考虑把数据copy到getwriteablepath下,以后都读新文件。方法如下:


bool AppDelegate::isFileExist(const char* pFileName)

{

if( !pFileName ) return false;

std::string filePath = CCFileUtils::sharedFileUtils()->getWriteablePath();

filePath += pFileName;

FILE *fp = fopen(filePath.c_str(),"r");

if(fp){

fclose(fp);

return true;

}

return false;

}

void AppDelegate::copyData(const char* pFileName)

{

if ( isFileExist(pFileName) ){

return ;

}

std::string strPath = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(pFileName);

unsigned long len = 0;

unsigned char *data = NULL;

data = CCFileUtils::sharedFileUtils()->getFileData(strPath.c_str(),"r",&len);

std::string destPath = CCFileUtils::sharedFileUtils()->getWriteablePath();

destPath += pFileName;

FILE *fp = fopen(destPath.c_str(),"w+");

fwrite(data,sizeof(char),len,fp);

fclose(fp);

delete []data;

data = NULL;

}

南湾的参考文档:http://codingnow.cn/cocos2d-x/939.html
关于pugixml:

在使用pugixml读取数据的时候,使用CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(pFileName)是获取不到路径。同样是因为这个方法读取不到apk里面的文件。

使用pugixml原理也是copy,目测是读到内存中,但是不用你自己操作重写文件,它提供了一个函数接受const char*到文件中。如下所示:


unsigned long nSize = 0;

unsigned char* pBuffer = CCFileUtils::sharedFileUtils()->getFileData(file, "rb", &nSize);

xml_document *doc = new xml_document();

xml_parse_result result = doc->load_buffer(pBuffer,nSize);

这个是群里的朋友:Sakana提供

哦,基本就这些,坐等拍砖……