cocos2d-x 中XML解析与数据存储

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

于是今天决定看一下之前不怎么非常熟悉的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啊

时间: 2024-10-08 06:53:27

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

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

IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都保存在APP所在的沙盒之中.一般有以下几种: 1.PList(XML属性列表) 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦 //写入文件 NSString *doc = [NSSearchPathForDirectoriesInDomains(

C# 将XML格式字符串,写入数据集的表中 XML解析

将XML格式字符串,写入数据集的表1中 命名空间:using System.Xml; string strRead;//strRead为以下xml值 XmlDocument xd = new XmlDocument(); xd.LoadXml(strRead); XmlNodeList nodeList = xd.SelectSingleNode("root").ChildNodes;//获取bookstore节点的所有子节点 foreach (XmlNode xn in nodeLi

cocos2d-x中的简单的数据存储

Cocos2d-x中的数据存储方式很多,下面我来简单的介绍几种,有说的不准确的地方,大家指出来吧,共同学习进步.谢谢! 首先介绍的是  UserDefault 这个类: //用userdefault进行数据存储 UserDefault::getInstance()->setStringForKey("testKey","testValue");//将String类型的数据存储起来 //读取上面写入的数据 std::string val = UserDefaul

Android中XML解析-Dom解析

Android中需要解析服务器端传过来的数据,由于XML是与平台无关的特性,被广泛运用于数据通信中,有的时候需要解析xml数据,格式有三种方式,分别是DOM.SAX以及PULL三种方式,本文就简单以Dom解析为例,解析XML, DOM方式解析xml是先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据的,但是这样一来,如果xml文件很大,手机CPU处理能力比PC差,因此在处理效率方面就相对差了,使用Dom解析就不是太合适了. 基础维护 首先下assets目录下新建一个Bo

Android中XML解析-PULL解析

前面写了两篇XML解析的Dom和SAX方式,Dom比较符合思维方式,SAX事件驱动注重效率,除了这两种方式以外也可以使用Android内置的Pull解析器解析XML文件. Pull解析器的运行方式与 SAX 解析器相似,也是事件触发的.Pull解析方式让应用程序完全控制文档该怎么样被解析,比如开始和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分处理.事件将作为数值代码

对比iOS中的四种数据存储

你是用什么方法来持久保存数据的?这是在几乎每一次关于iOS技术的交流或讨论都会被提到的问题,而且大家对这个问题的热情持续高涨.本文主要从概念上把“数据存储”这个问题进行剖析,并且结合各自特点和适用场景给大家提供一个选择的思路,并不详细介绍某一种方式的技术细节. 谈到数据储存,首先要明确区分两个概念,数据结构和储存方式.所谓数据结构就是数据存在的形式.除了基本的NSDictionary.NSArray和NSSet这些对象,还有更复杂的如:关系模型.对象图和属性列表多种结构.而存储方式则简单的分为两

Java中Xml解析(四种方法)

1.DOM,Document Object Model,基于DOM的XML分析器将XML文档转换成一个对象模型的集合(DOC树),通过对此模型操作实现对XML文档数据的操作,可以在任何时候对XML文档的任何一部分数据进行访问. DOC强制使用树模型来访问XML文档中信息 很灵活,当XML文档较大时对内存需求比较高,而且对结构复杂的DOC树的遍历也很耗时,对机器要求比较高. // step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器) DocumentBuilderFactory

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

转载:https://www.cnblogs.com/longqingyang/p/5577937.html 描述 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四种:1.DOM解析:2.SAX解析:3.JDOM解析:4.DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只

Java中XML解析工具范例

1.直接代码部分: 1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.util.List; 4 import org.jdom.Document; 5 import org.jdom.Element; 6 import org.jdom.input.SAXBuilder; 7 import org.xml.sax.InputSource; 8 9 /** 10 * 作用: XML解析工具类,其中的属性根据