Cocos2d-x 数据解析(json/xml)

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

下面是代码:

HelloParse.h:

#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__

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
 

猜你喜欢

转载自blog.csdn.net/houjia159/article/details/88551147
今日推荐