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

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...