1. 数据本地化

A CCUserDefault

系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDefault.xml.全部的key皆为char
*型。value类型为bool intfloat double std::string.

读操作

bool getBoolForKey(const char* pKey);

bool getBoolForKey(const char* pKey, bool defaultValue);

int getIntegerForKey(const char* pKey);

int getIntegerForKey(const char* pKey, int defaultValue);

float getFloatForKey(const char* pKey);

float getFloatForKey(const char* pKey, float defaultValue);

double getDoubleForKey(const char* pKey);

double getDoubleForKey(const char* pKey, double defaultValue);

std::string getStringForKey(const char * pKey);

std::string getStringForKey(const char* pKey,const std::string &defaultValue);

对于没有defaultValue的get方法,假设文件里没有对应的key,则得到的是0,假设有则对应的值。

对于有defaultValue的get方法,假设文件里没有对应的key,则得到的是defaultValue,假设有。则返回文件里的对应的值。

B
写操作

void setBoolForKey(const char* pKey, bool value);

void setIntegerForKey(const char* pKey, int value);

void setFloatForKey(const char* pKey, float value);

void setDoubleForKey(const char* pKey, double value);

void setStringForKey(const char* pKey, const std::string & value);

Set方法有个特点。是对于相对的key后面会对前面产生覆盖效果。

C
写入文件

CCUserDefault::sharedUserDefault()->flush();

尽管window平台是空,可是因为跨平台所导致的。

2 Xml文档格式

简单介绍

XML被设计用来传输和存储数据

语法

A
开头

<?xml version=”1.0” encoding=”utf-8”?>

B XML文档必须有根元素

XML文档必须有一个元素是全部其它元素的父元素。该元素称为根元素。

<root>

<child>

<subchild>…..</subchild>

</child>

</root>

C
全部XML元素都必须有关闭标签

<p>This is a paragraph</p>

<p>This is another paragraph</p>

D
在XML中,XML的属性值须加引號。

<note date="08/08/2008">

<to>George</to>

<from>John</from>

</note>

E XML中的凝视

<!— This is a comment -->

XML元素

指的是从(且包含)開始标签直到(且包含)结束标签的部分。

元素可包括其它元素、文本或者两者的混合物。元素也能够拥有属性。

<bookstore>

<book category="CHILDREN">

<title>Harry Potter</title>

<author>J K. Rowling</author>

<year>2005</year>

<price>29.99</price>

</book>

<book category="WEB">

<title>Learning XML</title>

<author>Erik T. Ray</author>

<year>2003</year>

<price>39.95</price>

</book>

</bookstore>

例:

<?

xml version="1.0" encoding="ISO-8859-1"?>

<note>

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don't forget the meeting!</body>

</note>

F:
生成xml文档

头文件

#include "support/tinyxml2/tinyxml2.h"

using namespace tinyxml2;

void makeXML(const char * fileName)

{

std::string filePath =

CCFileUtils::sharedFileUtils()->getWritablePath() + fileName;

tinyxml2::XMLDocument *pDoc = new tinyxml2::XMLDocument();

//xml
声明(參数可选)

XMLDeclaration *pDel = pDoc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\"");

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;

}

在cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下

<?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>

17.3.4解析xml

void parseXML(const char * fileName) {

std::string filePath = CCFileUtils::sharedFileUtils()->getWritablePath() + fileName;

tinyxml2::XMLDocument *pDoc = new tinyxml2::XMLDocument();

XMLError errorId = pDoc->LoadFile(filePath.c_str());

if (errorId != 0) {

//xml
格式错误

return;

}

XMLElement *rootEle = pDoc->RootElement();

//获取第一个节点属性

const XMLAttribute *attribute = rootEle->FirstAttribute();

//打印节点属性名和值

CCLog("attribute_name = %s,attribute_value = %s", attribute->Name(),

attribute->Value());

XMLElement *dicEle = rootEle->FirstChildElement("dic");

XMLElement *keyEle = dicEle->FirstChildElement("key");

if (keyEle) {

CCLog("keyEle Text= %s", keyEle->GetText());

}

XMLElement *arrayEle = keyEle->NextSiblingElement();

XMLElement *childEle = arrayEle->FirstChildElement();

while (childEle) {

CCLog("childEle Text= %s", childEle->GetText());

childEle = childEle->NextSiblingElement();

}

delete pDoc;

}

attribute_name = version,attribute_value = 1.0

keyEle Text= Text

childEle Text= Cocos2d-x

childEle Text= Cocos2d-x

childEle Text= Cocos2d-x

UserDefault.Xml操作案例:

T22UserDefault.h

#ifndef
__T22CCUserDefault_H__

#define
__T22CCUserDefault_H__

#include
"cocos2d.h"

#include
"TBack.h"

class
T22CCUserDefault :public
TBack

{

public:

CREATE_FUNC(T22CCUserDefault);

bool
init();

static
CCScene *
scene();

void
makeXML(char
* fileName);

void
parseXML(char
* fileName);

};

#endif

T22UserDefault.cpp

#include
"T22UserDefault.h"

#include
"AppMacros.h"

#include
"support/tinyxml2/tinyxml2.h"

using
namespace
tinyxml2;

CCScene *
T22CCUserDefault::scene()

{

CCScene *
scene =
CCScene::create();

T22CCUserDefault *
layer =
T22CCUserDefault::create();

scene->addChild(layer);

return
scene;

}

bool
T22CCUserDefault::init()

{

TBack::init();

//通过这样的方式向UserDefault.xml中写内容

CCUserDefault::sharedUserDefault()->setIntegerForKey("integer",
100);

CCUserDefault::sharedUserDefault()->setStringForKey("string","oooo");

//获得xml的路径

std::string
str =
CCUserDefault::sharedUserDefault()->getXMLFilePath();

//打印xml的路径

CCLog("path
= %s",
str.c_str());

CCLog("isXMLExist
= %d",
CCUserDefault::sharedUserDefault()->isXMLFileExist());

CCUserDefault::sharedUserDefault()->flush();

//假设有这个key的值则打印出,假设没有这个key则返回默认的值120

int
value =
CCUserDefault::sharedUserDefault()->getIntegerForKey("integer",
120);

CCLog("value
= %d",
value);

return
true;

}

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

UserDefault.xml的内容:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

操作xml和解释xml

#include
"T22UserDefault.h"

#include
"AppMacros.h"

#include
"support/tinyxml2/tinyxml2.h"

using
namespace
tinyxml2;

CCScene *
T22CCUserDefault::scene()

{

CCScene *
scene =
CCScene::create();

T22CCUserDefault *
layer =
T22CCUserDefault::create();

scene->addChild(layer);

return
scene;

}

bool
T22CCUserDefault::init()

{

TBack::init();

makeXML("test");

parseXML("test");

return
true;

}

void
T22CCUserDefault::makeXML(char
* fileName) {

std::string
filePath =

CCFileUtils::sharedFileUtils()->getWritablePath()
+ fileName;

tinyxml2::XMLDocument
*pDoc =
new
tinyxml2::XMLDocument();

//xml
声明(參数可选)

XMLDeclaration *pDel
= pDoc->NewDeclaration("xml
version=\"1.0\" encoding = \"UTF-8\"");

pDoc->LinkEndChild(pDel);

//加入 plist
节点

XMLElement *plistElement
= pDoc->NewElement("plist");

plistElement->SetAttribute("version",
"1.0");

pDoc->LinkEndChild(plistElement);

XMLComment *commentElement
= pDoc->NewComment("this
is x 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
T22CCUserDefault::parseXML(char
* fileName)

{

std::string
filePath =

CCFileUtils::sharedFileUtils()->getWritablePath()
+ fileName;

tinyxml2::XMLDocument
*pDoc =
new
tinyxml2::XMLDocument();

XMLError
errorId =
pDoc->LoadFile(filePath.c_str());

if (errorId
!= 0) {

//xml
格式错误

return;

}

XMLElement *rootEle
= pDoc->RootElement();

//获取第一个节点属性

const
XMLAttribute *attribute
= rootEle->FirstAttribute();

//打印节点属性名和值

CCLog("attribute_name
= %s,attribute_value = %s",
attribute->Name(),
attribute->Value());

XMLElement *dicEle
= rootEle->FirstChildElement("dic");

XMLElement *keyEle
= dicEle->FirstChildElement("key");

if (keyEle)
{

CCLog("keyEle
Text= %s",
keyEle->GetText());

}

XMLElement *arrayEle
= keyEle->NextSiblingElement();

XMLElement *childEle
= arrayEle->FirstChildElement();

while (childEle)
{

CCLog("childEle
Text= %s",
childEle->GetText());

childEle =
childEle->NextSiblingElement();

}

delete
pDoc;

}

执行结果:

Xml文件:

CCString,CCArray,CCDictionary

init()方法中

CCString *str
= CCString::create("1234");

CCLog("CCString
str = %s",
str->getCString());

CCLog("CCString
intTypeValue = %d",
str->intValue());

执行结果:

数据结构:CCString

/*使用std::string
创建了一个字符串,
你也能够传递一个c
字符串指针。由于

std::string
的构造函数能够訪问c
字符串指针

* @返回的CCString
指针是一个自己主动释放对象,

*也就意味着你不须要调用release
操作,除非你retain
了.

*/

static CCString* create(const std::string& str);

/*使用格式化方式来创建一个字符串,这种方法和c
语言里面的‘sprintf’类似,默认

缓存大小是(1024*100)bytes

*假如你想要改变这个缓存大小。你能够去CCString.cpp
中,更改kMaxStringLen

这个宏定义。

* @返回的CCString
指针是一个自己主动释放对象,

*也就意味着你不须要调用release
操作。除非你retain
了.

*/

static CCString* createWithFormat(const char* format, …);

/*
使用二进制数据来创建字符串

* @返回的CCString
指针是一个自己主动释放对象,

*也就意味着你不须要调用release
操作,除非你retain
了.

*/

static CCString* createWithData(const unsigned char* pData, unsigned

long nLen);

/*使用一个文件来创建一个字符串,

* @return A CCString pointer which is an autorelease object pointer,

* it means that you needn't do a release operation unless you retain

it.

*/

static CCString* createWithContentsOfFile(const char* pszFileName);

转换

CCString
同意CCString
实例变量转换为另外类型的变量。

/* convert to int value */

int intValue() const;

/* convert to unsigned int value */

unsigned int uintValue() const;

/* convert to float value */

float floatValue() const;

/* convert to double value */

double doubleValue() const;

/* convert to bool value */

bool boolValue() const;

常见的宏定义

#define CCStringMake(str) CCString::create(str)

#define ccs CCStringMake

CCArray

CCArray是一个面向对象包装类

CCArray继承至CCObject(CCObject主要是为了自己主动内存管理而创建的)而且提供了一系列接口。

创建

/**
创建一个数组*/

static CCArray* create();

/**
使用一些对象创建数组*/

static CCArray* create(CCObject* pObject, …);

/**
使用一个对象创建数组*/

static CCArray* createWithObject(CCObject* pObject);

/**
创建一个指定大小的数组*/

static CCArray* createWithCapacity(unsigned int capacity);

/**
使用一个现有的CCArray
数组来新建一个数组*/

static CCArray* createWithArray(CCArray* otherArray);

插入

/**
插入一个对象*/

void addObject(CCObject* object);

/**
插入别外一个数组里面的所有对象*/

void addObjectsFromArray(CCArray* otherArray);

/**
在一个确定的索引位置插入一个对象*/

void insertObject(CCObject* object, unsigned int index);

删除

/**
移除最后的一个对象*/

void removeLastObject(bool bReleaseObj = true);

/**移除一个确定的对象*/

void removeObject(CCObject* object, bool bReleaseObj = true);

/**
移除一个确定索引位置的元素*/

void removeObjectAtIndex(unsigned int index, bool bReleaseObj = true);

/**
移除所有元素*/

void removeObjectsInArray(CCArray* otherArray);

/**
移除全部对象*/

void removeAllObjects();

/**
高速移除一个对象*/

void fastRemoveObject(CCObject* object);

/**
高速移除一个确定索引位置的对象*/

void fastRemoveObjectAtIndex(unsigned int index);

remove
和fastRemove
有什么差别。能够看看源码,remove
是从CCArray中全然的移除。fastRemove
仅仅是将CCArray
中相应的对象释放掉了。没够改变整个CCArray
的结构。

从代码上来看,区别在于删除元素之后,是否把数组之后的元素向前移动覆盖掉之前位置的元素。代码上的区别例如以下所看到的:

unsigned int remaining = arr->num - index;

if(remaining>0)

{

memmove((void *)&arr->arr[index], (void *)&arr->arr[index+1],

remaining * sizeof(CCObject*));

}

遍历

CCARRAY_FOREACH(arr, obj)

主要事项

CCArray
一般不会被添加到其它类中,所以他的引用计数是1,而且设置为autorelease
对象。

创建CCArray
对象而且retain,然后在这个类中的析构函数中调用release
方法来释放内存。

假设CCObject
对象加入到CCArray
中。那么CCObject
对象的引用计数将

会加1.

CCDictionary

CCDirtionary使用UTHash实现的

keyword类型

CCDictionary支持两种类型的keyword,一个是std::string,一个是int.一个CCDictionary实例对象仅仅支持唯一的keyword。所以在你调用”setObject”方法的时候。你须要确认一下。

创建

static CCDictionary * create();

static CCDictionary * createWithDictionary(CCDictionary *srcDict)

static CCDictionary * createWithContentsOffFile(const char * pFileName);

插入

同样key的value会发生覆盖行为。

void setObject(CCObject *pObject,const std::string &key);

void setObject(CCObject *pObject,intptr_t key);

删除

void removeObjectForKey (const std::string &key)

void removeObjectForKey (intptr_t key)

void removeObjectsForKeys (CCArray *pKeyArray)

void removeObjectForElememt (CCDictElement *pElement)

void removeAllObjects ()

遍历

实现了CCDICT_FOREACH
方法来遍历整个字典。并且使用CCDICT_FOREACH
的方式和使用CCARRAY_FOREACH
的方式很类似

CCDictElement* pElement = NULL;

CCDICT_FOREACH(theDict, pElement)

{

CCObjectSubClass* pSubClassObj = (CCObjectSubClass*)pElement->getObject();

//
你也能够得到当前key,可是你须要确定key
的类型。

std::string oneStrKey = pElement->getStrKey(); //
假如key
的类型是string

// int oneIntKey = pElement->getIntKey(); //
假如有key
的类型是integer

//
以下就能够使用上面pSubClassObj
对象做一些操作了

}

举例

// Create a dictionary, return an autorelease object.

CCDictionary* pDict = CCDictionary::create();

// Insert objects to dictionary

CCString* pValue1 = CCString::create("100");

CCString* pValue2 = CCString::create("120");

CCInteger* pValue3 = CCInteger::create(200);

pDict->setObject(pValue1, "key1");

pDict->setObject(pValue2, "key2");

pDict->setObject(pValue3, "key3");

// Get the object for key

CCString* pStr1 = (CCString*)pDict->objectForKey("key1");

CCLog("{ key1: %s }", pStr1->getCString());

CCInteger* pInteger = (CCInteger*)pDict->objectForKey("key3");

CCLog("{ key3: %d }", pInteger->getValue());

结合xml支持中文

CCDictionary * dic = CCDictionary::createWithContentsOfFile("chinese.xml");

CCString * str = (CCString *)dic->objectForKey("people1");

CCLabelTTF * ttf = CCLabelTTF::create(str->getCString(), "Arial",20);

ttf->setPosition(ccp(240, 160));

addChild(ttf);

return true;

案例:

bool
T22CCUserDefault::init()

{

TBack::init();

CCDictionary *
dic =
CCDictionary::create();

dic->retain();

CCString *value1
= CCString::create("100");

CCString *value2
= CCString::create("200");

//第一个是value,第二个是key的意思

dic->setObject(value1,
"key1");

dic->setObject(value2,
"key2");

CCString *
str2 = (CCString
*)dic->objectForKey("key1");

//执行结果100

CCLog("%d",
str2->intValue());

CCLabelTTF *
ttf =
CCLabelTTF::create(str2->getCString(),
"Courier New", 30);

ttf->setPosition(ccp(240,160));

addChild(ttf);

return
true;

}

执行结果:

7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml的更多相关文章

  1. 读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作

    ios中数据持久化存储方式一般有5种:NSUserDefault.对象归档(NSKeyedArchiver).文件操作.数据库存储(SQLite3).CoreData. 1.NSUserDefault ...

  2. CSS控制XML与通过js解析xml然后通过html显示xml中的数据

    使用CSS控制XML的显示 book.css bookname{ display:block;color:Red} author{ display:block;font-style:italic} p ...

  3. 解析XML数据

    在 Java 程序中读取 XML 文件的过程称为解析 XML 解析 XML 文件的方式 1) DOM 解析 (java 官方提供) 2) SAX 解析(java 官方提供) 3) JDOM 解析(第三 ...

  4. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  5. TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏

    TinyXML2是simple.small.efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http: ...

  6. C#读取和写入XML文件

    关于xml是属于一个比较重要的东西,在平时开发的过程中,这块内容最主要的是要掌握XML内容的读取和写入操作. 一.什么是XML? XML 指可扩展标记语言(EXtensible Markup Lang ...

  7. C#的XML文件的读取与写入

    在设计程序的时候,对于一些变化性较强的数据,可以保存在XML文件中,以方便用户修改.尤其是对于一些软硬件的配置文件,很多都选择了用XML文件来存取.XML文件简单易用,而且可以在任何应用程序中读写数据 ...

  8. DOM的概念和简单应用:使用DOM解析XML数据

    概念:DOM是Document Object Model的简称,即文档数据模型. Oracle公司提供了JAXP(Java API for XML Processing)来解析XML.JAXP会把XM ...

  9. Python文件操作:文件的打开关闭读取写入

    Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...

随机推荐

  1. BZOJ 1529: [POI2005]ska Piggy banks( 并查集 )

    每一连通块砸开一个就可以拿到所有的钱, 所以用并查集求连通块数 ------------------------------------------------------------------- ...

  2. openssl生成pem,密钥证书的创建

    使用OpenSSL生成证书 首先得安装OpenSSL软件包openssl,安装了这个软件包之后,我们可以做这些事情: o Creation of RSA, DH and DSA Key Paramet ...

  3. QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)

    因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了.因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windo ...

  4. Cookie 路径在本机测试及服务器部署,在浏览器处理方式上的不同

    Table of Contents 1 问题场景 2 解决过程 2.1 cookie是否设置成功 2.2 cookie是否上传到服务器 3 总结 1 问题场景 最近在学用Python进行web开发,写 ...

  5. PAT 1002 Hello World for U (20)

    Given any string of N (>=5) characters, you are asked to form the characters into the shape of U. ...

  6. SharePoint 2013 &quot;通知我&quot;简单的功能

    简单的功能 "通知我"内部列表或文档库中的主要项目.加入/删除/修改等操作,用户的E- mail通知设定功能:设置列表或文档库通知的能力,有可能设置通知为一个单一的项目.这是Sha ...

  7. Google 开源项目风格指南阅读笔记(C++版)

    虽说是编程风格指南,可是干货也不少,非常多C++的有用技术在里面. 头文件 通常每一个.cpp文件都相应一个.h文件:#define保护全部头文件都应该使用#define防止头文件被多重包括,为保证唯 ...

  8. 编写自定义的JDBC框架与策略模式

    本篇根据上一篇利用数据库的几种元数据来仿造Apache公司的开源DbUtils工具类集合来编写自己的JDBC框架.也就是说在本篇中很大程度上的代码都和DbUtils中相似,学完本篇后即更容易了解DbU ...

  9. Java 通过 BufferReader 实现 文件 写入读取 示例

    package com.javatest.techzero.gui; import java.io.BufferedReader; import java.io.File; import java.i ...

  10. FireMonkey Style Designer

    http://docwiki.embarcadero.com/RADStudio/Berlin/en/FireMonkey_Style_Designer http://docwiki.embarcad ...