xml / json解析

来源:互联网 发布:网络最有名的改编歌曲 编辑:程序博客网 时间:2024/06/04 17:58

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”);//指定tagrequst->setResponseCallback(CC_CALLBACK_2(HelloWorld::httpcallback,this));//指定请求成功或者失败调用的函数//HttpCllient 在我们第一次请求的时候,会创建一个队列,并创建一个线程,线程指定的函数会查看队列有没有请求,如果有请求,线程会帮我们做网络请求,最后调用我们指定的httpcallbackHttpClient::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"));//如果没有,输出0log("%i",d->getIntegerForKey("int2",10));//如果没有,输出10log("%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内容写入到bufferFILE * file=fopen(path.c_str(), "w");if (file){    fputs(buffer.GetString(), file);    fclose(file);}

}

0 0