Cocos2d-x学习笔记(十三)—— 数据解析(json/xml)

在我们获取网络数据时,基本上使用的都是xml以及json,因此学习对这两种数据进行解析,对我们有很大的帮助。

下面是代码:

HelloParse.h:

<span style="font-size:18px;">#ifndef __HELLOPARSE_H__
#define __HELLOPARSE_H__

#include "cocos2d.h"

using namespace cocos2d;

class HelloParse : public cocos2d::Layer
{
public:
	static cocos2d::Scene* createParseScene();

	virtual bool init();

	void makejson();
	void parsejson();

	void makeXML(const char *fileName);
	void parseXML(const char *fileName);

	CREATE_FUNC(HelloParse);
};

#endif // !__HELLOMAP_H__
</span>

HelloParse.cpp:

#include "HelloParse.h"
#include "json/document.h"
#include "json/writer.h"
#include "json/stringbuffer.h"
#include "json/rapidjson.h"
#include "tinyxml2/tinyxml2.h"

using namespace tinyxml2;
using namespace rapidjson;
USING_NS_CC;

Scene* HelloParse::createParseScene()
{
	auto mapScene = Scene::create();
	auto mapLayer = HelloParse::create();

	mapScene->addChild(mapLayer);
	return mapScene;
}

bool HelloParse::init()
{
	if (!Layer::init())
	{
		return false;
	}

	makejson();
	parsejson();

	makeXML("lake.xml");
	parseXML("lake.xml");

	return true;
}

void HelloParse::makejson()
{
	/*生成json
	*/
	// 获得一个utf-8编码的文件对象
	rapidjson::Document document;
	// 设置一个空对象
	document.SetObject();
	// 获取分配器
	rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
	// 定义数组和对象
	rapidjson::Value array(rapidjson::kArrayType);
	rapidjson::Value object(rapidjson::kObjectType);
	// 添加数据成员
	object.AddMember("int", 1, allocator);
	object.AddMember("double", 1.0, allocator);
	object.AddMember("bool", true, allocator);
	object.AddMember("hello", "你好", allocator);
	// 将之前添加的数据放入到数组中
	array.PushBack(object, allocator);

	// 向文件对象添加成员
	document.AddMember("json", "json string", allocator);
	document.AddMember("array", array, allocator);

	// 分配缓冲区,把文件内容写入缓冲区
	StringBuffer buffer;
	rapidjson::Writer<StringBuffer> writer(buffer);
	document.Accept(writer);

	CCLOG("%s", buffer.GetString());
}

void HelloParse::parsejson()
{
	/*解析json
	*/
	std::string str = "{\"hello\" : \"word\"}";
	CCLOG("%s\n", str.c_str());
	rapidjson::Document d;
	// 将数据以json格式存入到d
	d.Parse<0>(str.c_str());
	if (d.HasParseError())  //打印解析错误
	{
		CCLOG("GetParseError %s\n", d.GetParseError());
	}
	// 获取key为hello的值
	if (d.IsObject() && d.HasMember("hello")) {

		CCLOG("%s\n", d["hello"].GetString());//打印获取hello的值
	}
}

void  HelloParse::makeXML(const char *fileName)
{
	// 获取可写入的路径加上文件名
	std::string filePath = FileUtils::getInstance()->getWritablePath() + fileName;

	// 创建一个xml文件
	tinyxml2::XMLDocument* pDoc = new tinyxml2::XMLDocument();

	//xml 声明(参数可选)
	XMLDeclaration *pDel = pDoc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\"");
	// 添加xml键值对节点结尾
	pDoc->LinkEndChild(pDel);

	// 添加plist节点
	XMLElement *plistElement = pDoc->NewElement("plist");
	// 设置属性
	plistElement->SetAttribute("version", "1.0");
	pDoc->LinkEndChild(plistElement);

	XMLComment *commentElement = pDoc->NewComment("this is xml comment");
	plistElement->LinkEndChild(commentElement);

	//添加dic节点
	XMLElement *dicElement = pDoc->NewElement("dic");
	plistElement->LinkEndChild(dicElement);

	//添加key节点
	XMLElement *keyElement = pDoc->NewElement("key");
	keyElement->LinkEndChild(pDoc->NewText("Text"));
	dicElement->LinkEndChild(keyElement);

	XMLElement *arrayElement = pDoc->NewElement("array");
	dicElement->LinkEndChild(arrayElement);

	for (int i = 0; i<3; i++) {
		XMLElement *elm = pDoc->NewElement("name");
		elm->LinkEndChild(pDoc->NewText("Cocos2d-x"));
		arrayElement->LinkEndChild(elm);
	}

	// 写入指定的文件
	pDoc->SaveFile(filePath.c_str());
	// 在屏幕上打印出来
	pDoc->Print();

	delete pDoc;
}

void HelloParse::parseXML(const char *fileName)
{
	std::string filePath = FileUtils::getInstance()->getWritablePath() + fileName;
	log("%s", filePath.c_str());
	tinyxml2::XMLDocument *pDoc = new tinyxml2::XMLDocument();
	// 加载指定目录文件,格式正确返回0
	XMLError errorId = pDoc->LoadFile(filePath.c_str());

	if (errorId != 0) {
		//xml格式错误
		return;
	}

	// 获取根节点,即<?xml version="1.0" encoding="UTF-8"?>
	XMLElement *rootEle = pDoc->RootElement();

	//获取第一个节点属性
	const XMLAttribute *attribute = rootEle->FirstAttribute();
	//打印节点属性名和值
	log("attribute_name = %s,attribute_value = %s", attribute->Name(), attribute->Value());

	// 根据key获取值
	XMLElement *dicEle = rootEle->FirstChildElement("dic");
	XMLElement *keyEle = dicEle->FirstChildElement("key");
	if (keyEle) {
		log("keyEle Text= %s", keyEle->GetText());
	}

	XMLElement *arrayEle = keyEle->NextSiblingElement();
	XMLElement *childEle = arrayEle->FirstChildElement();
	while (childEle) {
		log("childEle Text= %s", childEle->GetText());
		childEle = childEle->NextSiblingElement();
	}

	delete pDoc;
}

运行结果:

创建json:

{"json":"json string","array":[{"int":1,"double":1.0,"bool":true,"hello":"???"}]}

{"hello" : "word"}

解析json:

word

创建xml:

<?xml version="1.0" encoding="UTF-8"?>

<plist version="1.0">

<!--this is xml comment-->

<dic>

<key>Text</key>

<array>

<name>Cocos2d-x</name>

<name>Cocos2d-x</name>

<name>Cocos2d-x</name>

</array>

</dic>

</plist>

解析xml:

C:/Users/Administrator/AppData/Local/Helloworld/lake.xml

attribute_name = version,attribute_value = 1.0

keyEle Text= Text

childEle Text= Cocos2d-x

childEle Text= Cocos2d-x

childEle Text= Cocos2d-x

版权声明:转载请标明出处。

时间: 2024-10-11 21:56:51

Cocos2d-x学习笔记(十三)—— 数据解析(json/xml)的相关文章

android学习二十三(解析json格式数据)

前面我们已经掌握了xml格式数据的解析方式,那么接下来我们学习下如何解析json格式的数据.比起xml,json的主要优势在于它体积更小,在网络上传输的时候可以更省流量.但缺点在于,它的语义性差,看起来不如xml直观. 开始之前,先在自己的电脑apache-tomcat-6.0.39\webapps\ROOT路径目录下新建一个get_data.json的文件,然后编辑这个文件,并加入如下json格式的内容: [{"id":"5","version"

android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化

Android内置了PULL解析器的XPP3实现,以及SAX解析器等,可以直接使用PULL或SAX解析XML,直接把JAVA中进行PULL或SAX解析的代码直接拿来用,遗忘的话,可以参考java拾遗1,2,3关于XML的解析: 如有如下XmlUtils类实现PULL方式解析XML到List和序列化List到XML: Student实体类代码: 1 package cn.csc.bean; 2 3 public class Student { 4 5 private String id; 6 7

数据解析--JSON &amp; XML

>JSON 是一种轻量级的 数据格式 (就像文档有txt格式  ,有doc格式,JSON是数据的一种表现格式),一般用于数据交互, 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外,是文件) JSON的格式很像OC中的数组,字典.标准的JSON格式:key必须用双引号,不推荐单引号 想要从JSON中拿到具体的数据,需要对JSON进行解析.JSON--->OC >JSON解析方案 在iOS中,JSON的常见解析方案有4种 第三方框架:JSONKit.SBJson.

【Spring学习笔记-MVC-4】返回Json数据-方式2

摘要 本文讲解另外一种利用spring MVC返回json数据的方法. 前文回顾 在<[Spring学习笔记-MVC-3]返回Json数据-方式1>中介绍了通过: @ResponseBody声明返回值: 配置<mvc:annotation-driven />: 来返回json数据.效果如下:   ==>, 从上面的效果看,只能返回一个对象,不能返回多个对象,不能做到形如下图的返回结果, 存在局限性(可能可以返回多个,自己不知道如何实现). 下面介绍的方式2,利用spring

java之jvm学习笔记十三(jvm基本结构)

java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力,这一章之后你会充满自信.当然,不是说看完本章,就对jvm了解了,jvm要学习的知识实在是非常的多.在你看完本节之后,后续我们还会来学jvm的细节,但是如果你在学习完本节的前提下去学习,再学习其他jvm的细节会事半功倍. 为了让你每一个知识点都有迹

马程序员学习笔记——红黑树解析四

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 本篇是将上面三篇的理论知识转化成代码,java实现 首先,看一下算法导论里的伪代码 一.左旋 The pseudocode for LEFT-ROTATE assumes that right[x] ≠ nil[T] and that the root's parent is nil[T].(伪代码的左旋方法中假设X的右孩子不为空) LEFT-

马程序员学习笔记——红黑树解析二

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 四.树中删除元素 1.先找到需要删除的元素. 2. 2.1如果被删元素没有子元素,那么直接用NIL节点代替他: 2.2如果被删元素只有一个子元素,那么直接用这个子元素代替他: 2.3如果被删元素有两个子元素,那么就用左子元素中的最大元素或者右子元素的最小元素代替他. 比如说原来要删除的元素是N,N有两个分支,其中P是N左分支中的最大元素,那么就

python 学习笔记 3 -- 数据结构篇上

数据结构是可以处理一些 数据 的 结构 .或者说,它们是用来存储一组相关数据的.在Python中有三种内建的数据结构--列表.元组和字典.本文主要对这三种数据类型以及相关的使用做介绍,以例子的形式演示更加容易理解! 1.列表(List) 列表是处理一组有序项目的数据结构,即你可以在一个列表中存储一个 序列 的项目.在Python中,你在每个项目之间用逗号分割. 列表中的项目应该包括在**方括号**中,这样Python就知道你是在指明一个列表.一旦你创建了一个列表,你可以添加.删除或是搜索列表中的

python 学习笔记 3 -- 数据结构篇下

5.引用 当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 引用 那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存.这被称作名称到对象的绑定.eg. [python] view plaincopy # -*- coding: utf-8 -*- shoplist = ['apple', 'mango', 'carrot', 'banana'] print "we copy the shoplist to mylist directly \"with

springmvc学习笔记(15)-数据回显

springmvc学习笔记(15)-数据回显 springmvc学习笔记15-数据回显 pojo数据回显方法 简单类型数据回显 本文介绍springmvc中数据回显的几种实现方法 数据回显:提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面. pojo数据回显方法 1.springmvc默认对pojo数据进行回显. pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写) 使用@ModelAttribute