xml / json解析

include “cocos2d.h”

include”network/HttpClient.h”

include

using namespace std;
using namespace cocos2d::network;

include “json/document.h”

include”json/rapidjson.h”//解析

include”json/stringbuffer.h”

include”json/writer.h”//修改

using namespace rapidjson;//json的操作 头文件盒命名解析

include”tinyxml2/tinyxml.h”

using namespace tinyxml2;//xml操作头文件盒命名空间

//网络请求数据
//Get
void httpGet()
{
HttpRequest * request = new HttpRequst();//一个网络请求

request->setUrl("http://42.96.151.161:83/service/userlogin?user_name=test12&user_password=123456");

//指定资源的位置get形势的 数据接在url后面 安全性低 数据量小 方便快捷

request->setRequestType(cocos2d::network::HttpRequst::Type::GET);//指明请求的类型

request->setTag(“requestget”);//指定tag

requst->setResponseCallback(CC_CALLBACK_2(HelloWorld::httpcallback,this));//指定请求成功或者失败调用的函数

//HttpCllient 在我们第一次请求的时候,会创建一个队列,并创建一个线程,线程指定的函数会查看队列有没有请求,如果有请求,线程会帮我们做网络请求,最后调用我们指定的httpcallback
HttpClient::getInstance()->send(request);
//进行网络请求  send中会retain一次。

request->release();//马上执行的语句

}

//Post
void HelloWorld::httpPost()
{
HttpRequest * request=new HttpRequest();
request->setUrl(“http://42.96.151.161:83/service/userlogin?”);
request->setRequestType(cocos2d::network::HttpRequest::Type::POST);
__String * str=__String::createWithFormat(“user_name=test12&user_password=123456”);
request->setRequestData(str->getCString(), str->length());
request->setTag(“httpPost”);

request->setResponseCallback(CC_CALLBACK_2(HelloWorld::httpcallback, this));
//安全数据量大

HttpClient::getInstance()->setTimeoutForConnect(30);//设置连接的超时时间
HttpClient::getInstance()->setTimeoutForRead(30);//设置读取数据的超时时间

HttpClient::getInstance()->send(request);
request->release();

}

//数据请求的回调函数
void HelloWorld::httpcallback(HttpClient* client, HttpResponse* response)
{
if (!response)
{
return;
}
/*
1xx:指示信息--表示请求已接受,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
*/
log(“%li”,response->getResponseCode());

if (response->getResponseCode()==200)//200代表成功
{
    HttpRequest * request=response->getHttpRequest();

    log("%s",request->getTag());

    std::vector<char>*data=response->getResponseData();//获取服务器返回的数据
    for (int i=0; i<data->size(); i++)
    {
        cout<<data->at(i);
    }
    cout<<endl;
}

}

//UserDefault存储数据
void HelloWorld::userDefault()
{
UserDefault * d=UserDefault::getInstance();//单例

//  存储数据

// d->setIntegerForKey(“int1”, 10);
// d->setStringForKey(“string1”, “string1”);
// d->setBoolForKey(“bool1”, true);
// d->setDoubleForKey(“double1”, 10.0);
// d->flush();//强制写入文件 这些数据会写入到com.neworigin.httpdemo.plist

//log("%s",FileUtils::getInstance()->fullPathForFilename("HelloWorld.png").c_str());

log("%i",d->getIntegerForKey("int1"));//如果没有,输出0

log("%i",d->getIntegerForKey("int2",10));//如果没有,输出10

log("%s",FileUtils::getInstance()->getWritablePath().c_str());//获取可读可写路径document  data/data/com/neworigin/httpdemo/

if (d->getBoolForKey("musicion",true))
{
    //checkbox 是选中的状态

}
else
{
    //checkbox 是非选中的状态
} 

}

//解析前
copyFile(“Chapters.xml”);//拷贝chapters.xml到可读可写的路径下
//文件复制
void HelloWorld::copyFile(std::string name)
{
string path1=FileUtils::getInstance()->fullPathForFilename(name);//.app 文件全路径
string path2=FileUtils::getInstance()->getWritablePath()+name;//获得可读可写的文件夹 +name
log(“%s”,path1.c_str());
log(“%s”,path2.c_str());

if (!FileUtils::getInstance()->isFileExist(path2))//在可读可写文件夹中没有文件
{
    string data=FileUtils::getInstance()->getStringFromFile(path1);
    FILE * file=fopen(path2.c_str(), "w");//以写的方式打开文件(“w”)  如果文件不存在会创建文件
    fputs(data.c_str(), file);//写入内容
    fclose(file);//关闭文件
}

}

//xml解析
void HelloWorld::xmlDemo()
{
tinyxml2::XMLDocument doc;//document对象,可以对xml字符串进行解析

//获得xml字符串
string path= FileUtils::getInstance()->getWritablePath()+"Chapters.xml";
string data=FileUtils::getInstance()->getStringFromFile(path.c_str());

//使用document对象解析字符串
doc.Parse(data.c_str());

//判断解析是否成功
if (doc.Error())
{
    return;
}

//获取值
XMLElement * rootElement=doc.RootElement();

XMLElement * element1_1=rootElement->FirstChildElement();
log(“%s”,element1_1->Value());
XMLElement * element1_1_1=element1_1->FirstChildElement();
log(“%s”,element1_1_1->Value());
log(“%s”,element1_1_1->GetText());
XMLElement * element1_1_2=element1_1_1->NextSiblingElement();
log(“%s”,element1_1_2->Value());
log(“%s”,element1_1_2->GetText());

XMLElement * element1_2=rootElement->FirstChildElement();
XMLElement * element1_2_1=element1_2->NextSiblingElement()->FirstChildElement();
log("%s",element1_2_1->Value());
log("%s",element1_2_1->GetText());


//修改
XMLElement * ele=doc.RootElement()->FirstChildElement()->FirstChildElement()->NextSiblingElement();//<Number>1</Number>
XMLNode * node=ele->FirstChild();
node->SetValue("2");
doc.SaveFile(path.c_str());

//添加
XMLElement * myelement=doc.NewElement("levels");//<levels></levels>
XMLText * text=doc.NewText("1");
myelement->LinkEndChild(text);
doc.RootElement()->FirstChildElement()->InsertAfterChild(ele, myelement);//InsertAfterChild函数的调用者是想添加元素的父元素   第一个参数是在哪个元素之后添加我们指定的元素   第二个参数是需要添加的元素
doc.SaveFile(path.c_str());//保存到文件


//删除
doc.DeleteNode(ele);//删除指定的文件
doc.SaveFile(path.c_str());//保存到文件

}

//json解析
void HelloWorld::jsonDemo()
{
rapidjson::Document doc;//创建一个docunment对象
//doc.Parse<<#unsigned int parseFlags#>>(<#const Ch *str#>)//会开新空间
std::string path=FileUtils::getInstance()->getWritablePath()+”Data.json”;
std::string data=FileUtils::getInstance()->getStringFromFile(path.c_str());

doc.ParseInsitu<rapidjson::kParseInsituFlag>((char *)data.c_str());//在原空间操作  在原内存直接解析  这一步运行完成  就解析完成

if(doc.HasParseError())//查看是否有错误
{
    return;
}

if (doc.HasMember("username"))//有没有这个元素
{
    log("%s",doc["username"].GetString());
}

if (doc.HasMember("costume"))
{
    if (doc["costume"].IsObject())
    {
        if (doc["costume"].HasMember("clothing"))
        {
            log("%s",doc["costume"]["clothing"].GetString());
        }
    }
}


if (doc.HasMember("costume"))
{
    if (doc["costume"].IsObject())
    {
        if (doc["costume"].HasMember("headpiece"))
        {
            log("%s",doc["costume"]["headpiece"].GetString());
        }
    }
}


if (doc.HasMember("weapon"))
{
    if (doc["weapon"].IsArray())
    {
        int i=0;
        log("%i",doc["weapon"][i].GetInt());
    }
}


//修改
__String * str=__String::createWithFormat("username");

doc["username"].SetString(str->getCString(), str->length());//这样只是对doc对象中的数据修改了

doc.AddMember("hp", "10", doc.GetAllocator());//添加一个元素

doc.RemoveMember("levels");//删除元素


//保存
rapidjson::StringBuffer buffer;//用来放doc内容  字符串形势的
rapidjson::Writer<rapidjson::StringBuffer>write(buffer);//可以把doc内容 改为字符串形势写入到buffer里面
doc.Accept(write);//将doc内容写入到buffer

FILE * file=fopen(path.c_str(), "w");

if (file)
{
    fputs(buffer.GetString(), file);
    fclose(file);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值