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

于是今天决定看一下之前不怎么非常熟悉的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. Android圆角Tag控件的另类实现

    一般的圆角标签控件都是用xml设置shape做实现.可是假设我们想要做一个更加强大通用的的圆角控件,不须要使用者去关心圆角,仅仅设置背景就能够了. 应该怎么实现呢?这个就须要把背景先设置成图片,然后再 ...

  2. UVA - 11722 Joining with Friend 几何概率

                            Joining with Friend You are going from Dhaka to Chittagong by train and you ...

  3. [AHOI 2009] 同类分布

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1799 [算法] 数位DP [代码] #include<bits/stdc++. ...

  4. Java基础之关键字

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

  5. 移动端H5页面编辑器开发实战--经验技巧篇

    很久前的写的文章了,转载下发到这里 原本地址: https://blog.csdn.net/tech_meizu/article/details/52484775

  6. 使用右键打开Visual Code

    Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\Visual Code]@="Edit with Visual ...

  7. Python—使用xml.sax解析xml文件

    什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处 ...

  8. BZOJ 3674/BZOJ 3673 主席树

    思路: 主席树维护可持久化数组 剩下的就是普通的并查集了- //By SiriusRen #include <cstdio> #include <cstring> #inclu ...

  9. Codeforces 232E - Quick Tortoise bitset+分治

    题意: 思路: //By SiriusRen #include <cstdio> #include <bitset> #include <vector> using ...

  10. android编译ffmpeg+x264

    下载最新版的x264ftp://ftp.videolan.org/pub/videolan/x264/snapshots/1.解压到指定的目录2.切换当前目录为该目录3.创建一个shell脚本buil ...