【cocos2dx】XMLを利用してサーバーと通信する。

サーバーと通信をする際によく使われるデータ形式の1つに「XML」があります。サーバーのデータをXMLを使って受信することが可能になります。 今回は、cocos2dxで、「XML」を利用する方法を紹介したいと思います。

[JSONを利用する場合はこちらを参考] 【cocos2dx】JSONを利用してサーバーと通信する。 | albatrus.com

準備 - tinyxml2

XMLを分析するライブラリは「tinyxml2」を利用します。 cocos2dxに用意されているので、何もしなくても利用ができます。 [c] //ライブラリを読み込みます。

include "external/tinyxml2/tinyxml2.h"

using namespace tinyxml2; [/c]

準備 - HttpClient

サーバーとの通信には[HttpClient]クラスを利用します。 [c] //ライブラリを読み込みます。

include "network/HttpClient.h"

using namespace cocos2d::network; [/c]

Android

Android.mkを修正します。 下記2つを追加します。 [c]

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_network_static

$(call import-module,network)

[/c]

準備 - xmlフアイル

サーバーに通信で読み込むxmlフアイルを設置します。 今回はDropboxを利用しています。 [c] <?xml version="1.0" encoding="UTF-8" ?> albatrus-xml cocos2dx-xml/ [/c]

これで準備完了です。

XMLを実装

XMLファイルの値を取り出すコードを書きました。 「cocos2dxのレシピ本」を参考にしています。 [c] void NetWorkLayer::getXmlValue(const char *url){

cocos2d::network::HttpRequest *request = new HttpRequest();
request->setUrl(url);
request->setRequestType(HttpRequest::Type::GET);
request->setResponseCallback(CC_CALLBACK_2(NetWorkLayer::callback2,this));
HttpClient::getInstance()->send(request);
request->release();

}

void NetWorkLayer::callback2(cocos2d::network::HttpClient sender, cocos2d::network::HttpResponse response){

if (!response->isSucceed()) {

    return;
}

std::vector<char> *buffer = response->getResponseData();
std::string _xml = std::string(buffer->begin(), buffer->end());

XMLDocument doc;
if (doc.Parse(_xml.c_str()) == XML_NO_ERROR) {


    const XMLElement *test = doc.FirstChildElement();
    for (;test;test = test->NextSiblingElement()) {

       //ここでXMLフアイルの値を取り出します。 const XMLElement _x = test->FirstChildElement("x"); __String xStr = _String::create(x->GetText());

        const XMLElement *_y = test->FirstChildElement("y");
        __String *yStr = __String::create(_y->GetText());

        CCLOG("x:%s y:%s",xStr->getCString(),yStr->getCString());


    }

}

}

[/c]

実際の利用する際にはgetXmlValue()XMLファイルのURLを指定して下さい。 [c] void NetWorkLayer::networkXML(){

this->getXmlValue("https://dl.dropboxusercontent.com/..........xml");

}

[/c]

これで完了です。

最後に

前回のエントリーに引き続き、サーバーとの通信についてのエントリーでした。 今回利用しているHttpClientは、非同期でファイルを読み込むことができるので、変な待ち時間ができません。 実際の利用は、libcurlよりもこちらの方がいいかもしれません。(もしかしたら、非同期ができるかもしれませんが)

いかがでしたでしょうか? サーバ関係、XMLについてはこれまで触ったことがなかったので、コードなど不安です。 もし、もっと良い方法等あれば教えていただけると嬉しいです。

Cocos2d‐x開発のレシピ―iOS/Android対応Cocos2d‐x開発のレシピ―iOS/Android対応
松浦 晃洋,齊藤 建二,古木 映治

秀和システム
売り上げランキング : 49215

Amazonで詳しく見る