一不小心就玩了一周的游戏了。哎。玩的时候时间过得总是这么快。。。

于是今天决定看一下之前不怎么非常熟悉的XML;(之前做游戏时数据的储存用到过XML,但这块是还有一个同事在做,所以不怎么熟悉),

看了看他写的xml和解析方法。然后自己改进了下。所以来简单的总结和分享分享

主要涉及到的有:

1. xml 创建

2.xml的解析

3.将解析后的xml数据用vector保存起来。

例如以下:(写完xml后,最简单的检查语法错误就是用IE浏览器打开看看,能够打开则说明语法没错)

<?xml version="1.0" encoding="utf-8"?>
<Mineral>
<mineral>
<type>1</type>
<times>100</times>
<p>20</p>
</mineral> <mineral>
<type>4</type>
<times>100</times>
<p>20</p>
</mineral> <mineral>
<type>5</type>
<times>100</times>
<p>20</p>
</mineral> </Mineral>

在这里我依照网上的XML书写格式新建了一个名为 "Mineral.xml"的xml;

(Mineral就是矿的意思,xml 中我任意写了3中类型的矿石,每种矿石有自己的类型、倍率、概率)

然后将其保存在资源目录里面,然后新建一个cocos2d-x项目。

以下贴出主要解析代码

//.h文件

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__ #include "cocos2d.h"
#include <string>
#include <vector> typedef struct Mineral
{
int times ;
int type;
int p; }*PtrMineral; class HelloWorld : public cocos2d::CCLayer
{
public:
virtual bool init();
static cocos2d::CCScene* scene();
void menuCloseCallback(CCObject* pSender);
bool readMinearlXml();
void displayVec();
CREATE_FUNC(HelloWorld);
private:
std::vector<PtrMineral >m_pMineralVec ;
}; #endif

//.cpp文件

#include "HelloWorldScene.h"
#include "../support/tinyxml2/tinyxml2.h" using namespace tinyxml2;
USING_NS_CC; CCScene* HelloWorld::scene()
{ CCScene *scene = CCScene::create();
HelloWorld *layer = HelloWorld::create();
scene->addChild(layer);
return scene;
} bool HelloWorld::init()
{
if ( !CCLayer::init() )
{
return false;
}
readMinearlXml();
displayVec();
return true;
} bool HelloWorld::readMinearlXml()
{
tinyxml2::XMLDocument* xmlData = new tinyxml2::XMLDocument();
unsigned long nSize ;
const char *pXmlBuffer = (const char*)CCFileUtils::sharedFileUtils()->getFileData("XML/Mineral.xml","rb",&nSize); if( NULL == pXmlBuffer )
{
CCLOG("read Mineral.xml Failed");
}
else
CCLOG("star read Mineral.xml"); xmlData->Parse(pXmlBuffer,nSize);
XMLElement *rootNode = xmlData->RootElement();
if(!rootNode)
{
return false;
}
XMLElement* curNode = rootNode->FirstChildElement("mineral"); while(NULL!= curNode)
{
PtrMineral pMineral =new Mineral();
pMineral->type = (atoi)( (curNode->FirstChildElement("type"))->GetText() );
pMineral->times = (atoi)( (curNode->FirstChildElement("times"))->GetText() );
pMineral->p = (atoi)( (curNode->FirstChildElement("p"))->GetText() );
m_pMineralVec.push_back(pMineral);
curNode = curNode->NextSiblingElement("mineral");
}
delete xmlData;
return true; }
void HelloWorld::displayVec()
{
CCLOG("*********m_pMineralVec*********");
for(int i = 0 ; i<m_pMineralVec.size() ; i++)
{
CCLOG("<mineral>");
CCLOG(" <type> = %i </type>",m_pMineralVec[i]->type);
CCLOG(" <times> = %i </times>",m_pMineralVec[i]->times);
CCLOG(" <p> = %i </p>",m_pMineralVec[i]->p);
CCLOG("</mineral>"); } } void HelloWorld::menuCloseCallback(CCObject* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
#else
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
#endif
}

上面分别包括了xml的解析即xml的数据显示:

显演示样例如以下:

star read Mineral.xml
*********m_pMineralVec*********
<mineral>
<type> = 1 </type>
<times> = 100 </times>
<p> = 20 </p>
</mineral>
<mineral>
<type> = 4 </type>
<times> = 100 </times>
<p> = 20 </p>
</mineral>
<mineral>
<type> = 5 </type>
<times> = 100 </times>
<p> = 20 </p>
</mineral>

对照可知,输出结果和之前创建的xml一致。就这样。xml的解析就ok 了,是不是非常easy啊

cocos2d-x 中XML解析与数据存储的更多相关文章

  1. Android中的5种数据存储方式

    本文转自  http://hi.baidu.com/maguowei/blog/item/7aca46c25574a33ae5dd3ba4.htmlAndroid数据存储Android提供了5种方式存 ...

  2. 2016 - 1- 23 iOS中xml解析 (!!!!!!!有坑要解决!!!!!!)

    一: iOS中xml解析的几种方式简介 1.官方原生 NSXMLParser :SAX方式解析,使用起来比较简单 2.第三方框架 libxml2 :纯C 同时支持DOM与SAX GDataXML: D ...

  3. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

  4. C#操作数据表中XML格式的数据

    以前还真没有见过数据表中存储XML格式的数据,刚开始听说的时候,还以为是数据表中有XML的字段类型, 再了解,其实也就是字符串类型的,只不过字符串的格式是XML格式的.确实孤陋寡闻!汗... (可添加 ...

  5. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

  6. Android中XML解析-Dom解析

    Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以D ...

  7. Android中XML解析-PULL解析

    前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 ...

  8. xml解析----java中4中xml解析方法(转载)

    转载:https://www.cnblogs.com/longqingyang/p/5577937.html 描述 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与 ...

  9. Android中XML解析-SAX解析

    昨天由于时间比较匆忙只写了Android中的XML解析的Dom方式,这种方式比较方便,很容易理解,最大的不足就是内容多的时候,会消耗内存.SAX(Simple API for XML)是一个解析速度快 ...

随机推荐

  1. Drupal 自己定义主题实体 Theming Custom Entities

    在自己定义主题中输出结果时,有三个部分或很多其它特殊的函数.如 hook_menu,Page Callback.MODULE_theme 钩子 1.hook_menu 为了使用自己定义的实体.像创建. ...

  2. Java基础之关键字

    一.Java关键字总览 基本数据类型(9):boolean.char.byte.short.int.long.float.double.null 变量引用(2):super.this 类.方法.变量修 ...

  3. 使用VMware搭建3台一模一样的Linux虚拟机

    转自:https://www.linuxidc.com/Linux/2014-08/105909.htm 简介:VMware可以在个人本地一台笔记本机器上同时运行二个或更多Windows.DOS.LI ...

  4. 18. 4Sum[M]四数之和

    题目 Given an array nums of n integers and an integer target, are there elements a, b, c and d in nums ...

  5. linux服务器卸载本机默认安装的jdk

    1.      查看系统安装的版本情况: rpm -qa | grep jdk rpm -qa | grep gcj 2.      查看并删除 [root@iZ2zeedm3x12d8xb4g15a ...

  6. Spark RDD概念学习系列之transformation操作

    不多说,直接上干货! transformation操作 惰性求值 (1)RDD 的转化操作都是惰性求值的.这意味着在被调用行动操作之前Spark不会开始计算. (2)读取数据到RDD的操作也是惰性的. ...

  7. Spark RDD概念学习系列之典型RDD的特征

    不多说,直接上干货!

  8. Android 高大上的侧滑菜单DrawerLayout,解决了不能全屏滑动的问题

    DrawerLayout预览 DrawerLayout主要功能就是 实现侧滑菜单效果的功能,并且可以通过增加一些设置来实现高大上的效果,那么就请看动态图:   注意左上角那个图标,有木有很好玩,哈哈. ...

  9. 安卓input框获取焦点时,底部按钮会顶上去的解决方法

    var h = document.body.scrollHeight;window.onresize = function(){ if (document.body.scrollHeight < ...

  10. 【node.js web项目】解决路由默认是hash模式(带#)

    [概念讲述] 1.什么是hash模式 Vue+WebPack项目,本身是一个单页应用. vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 ...