7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml
数据本地化
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 #define #include #include class { public: CREATE_FUNC(T22CCUserDefault); bool static void void }; #endif |
T22UserDefault.cpp |
#include #include #include using CCScene * { CCScene * T22CCUserDefault * scene->addChild(layer); return } bool { TBack::init(); //通过这样的方式向UserDefault.xml中写内容 CCUserDefault::sharedUserDefault()->setIntegerForKey("integer", CCUserDefault::sharedUserDefault()->setStringForKey("string","oooo"); //获得xml的路径 std::string //打印xml的路径 CCLog("path CCLog("isXMLExist CCUserDefault::sharedUserDefault()->flush(); //假设有这个key的值则打印出,假设没有这个key则返回默认的值120 int CCLog("value return } |
执行结果:
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 #include #include using CCScene * { CCScene * T22CCUserDefault * scene->addChild(layer); return } bool { TBack::init(); makeXML("test"); parseXML("test"); return } void std::string CCFileUtils::sharedFileUtils()->getWritablePath() tinyxml2::XMLDocument //xml XMLDeclaration *pDel pDoc->LinkEndChild(pDel); //加入 plist XMLElement *plistElement plistElement->SetAttribute("version", pDoc->LinkEndChild(plistElement); XMLComment *commentElement plistElement->LinkEndChild(commentElement); //加入 dic XMLElement *dicElement plistElement->LinkEndChild(dicElement); //加入 key XMLElement *keyElement keyElement->LinkEndChild(pDoc->NewText("Text")); dicElement->LinkEndChild(keyElement); XMLElement *arrayElement dicElement->LinkEndChild(arrayElement); for (int XMLElement *elm elm->LinkEndChild(pDoc->NewText("Cocos2d-x")); arrayElement->LinkEndChild(elm); } pDoc->SaveFile(filePath.c_str()); pDoc->Print(); delete } void { std::string CCFileUtils::sharedFileUtils()->getWritablePath() tinyxml2::XMLDocument XMLError if (errorId //xml return; } XMLElement *rootEle //获取第一个节点属性 const //打印节点属性名和值 CCLog("attribute_name XMLElement *dicEle XMLElement *keyEle if (keyEle) CCLog("keyEle } XMLElement *arrayEle XMLElement *childEle while (childEle) CCLog("childEle childEle = } delete } |
执行结果: Xml文件: |
CCString,CCArray,CCDictionary
init()方法中 CCString *str CCLog("CCString CCLog("CCString |
执行结果: |
数据结构:CCString
/*使用std::string std::string * @返回的CCString *也就意味着你不须要调用release */ static CCString* create(const std::string& str); /*使用格式化方式来创建一个字符串,这种方法和c 缓存大小是(1024*100)bytes *假如你想要改变这个缓存大小。你能够去CCString.cpp 这个宏定义。 * @返回的CCString *也就意味着你不须要调用release */ static CCString* createWithFormat(const char* format, …); /* * @返回的CCString *也就意味着你不须要调用release */ 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 |
/* 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); /** 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(); // std::string oneStrKey = pElement->getStrKey(); // // int oneIntKey = pElement->getIntKey(); // // } |
举例
// 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 { TBack::init(); CCDictionary * dic->retain(); CCString *value1 CCString *value2 //第一个是value,第二个是key的意思 dic->setObject(value1, dic->setObject(value2, CCString * //执行结果100 CCLog("%d", CCLabelTTF * ttf->setPosition(ccp(240,160)); addChild(ttf); return } |
执行结果: |
7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml的更多相关文章
- 读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作
ios中数据持久化存储方式一般有5种:NSUserDefault.对象归档(NSKeyedArchiver).文件操作.数据库存储(SQLite3).CoreData. 1.NSUserDefault ...
- CSS控制XML与通过js解析xml然后通过html显示xml中的数据
使用CSS控制XML的显示 book.css bookname{ display:block;color:Red} author{ display:block;font-style:italic} p ...
- 解析XML数据
在 Java 程序中读取 XML 文件的过程称为解析 XML 解析 XML 文件的方式 1) DOM 解析 (java 官方提供) 2) SAX 解析(java 官方提供) 3) JDOM 解析(第三 ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏
TinyXML2是simple.small.efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http: ...
- C#读取和写入XML文件
关于xml是属于一个比较重要的东西,在平时开发的过程中,这块内容最主要的是要掌握XML内容的读取和写入操作. 一.什么是XML? XML 指可扩展标记语言(EXtensible Markup Lang ...
- C#的XML文件的读取与写入
在设计程序的时候,对于一些变化性较强的数据,可以保存在XML文件中,以方便用户修改.尤其是对于一些软硬件的配置文件,很多都选择了用XML文件来存取.XML文件简单易用,而且可以在任何应用程序中读写数据 ...
- DOM的概念和简单应用:使用DOM解析XML数据
概念:DOM是Document Object Model的简称,即文档数据模型. Oracle公司提供了JAXP(Java API for XML Processing)来解析XML.JAXP会把XM ...
- Python文件操作:文件的打开关闭读取写入
Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...
随机推荐
- BZOJ 1529: [POI2005]ska Piggy banks( 并查集 )
每一连通块砸开一个就可以拿到所有的钱, 所以用并查集求连通块数 ------------------------------------------------------------------- ...
- openssl生成pem,密钥证书的创建
使用OpenSSL生成证书 首先得安装OpenSSL软件包openssl,安装了这个软件包之后,我们可以做这些事情: o Creation of RSA, DH and DSA Key Paramet ...
- QWidget类中默认是忽略inputMethodEvent事件(要获取输入的内容就必须使用这个事件)
因为项目的需要以及主管的要求,准备将工程移植到Qt中,这样就可以比较容易的实现跨平台了.因为之前工程是在windows下开发的,第一个平台又是mobile所以除了底层框架之外其他的都是使用的windo ...
- Cookie 路径在本机测试及服务器部署,在浏览器处理方式上的不同
Table of Contents 1 问题场景 2 解决过程 2.1 cookie是否设置成功 2.2 cookie是否上传到服务器 3 总结 1 问题场景 最近在学用Python进行web开发,写 ...
- 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. ...
- SharePoint 2013 "通知我"简单的功能
简单的功能 "通知我"内部列表或文档库中的主要项目.加入/删除/修改等操作,用户的E- mail通知设定功能:设置列表或文档库通知的能力,有可能设置通知为一个单一的项目.这是Sha ...
- Google 开源项目风格指南阅读笔记(C++版)
虽说是编程风格指南,可是干货也不少,非常多C++的有用技术在里面. 头文件 通常每一个.cpp文件都相应一个.h文件:#define保护全部头文件都应该使用#define防止头文件被多重包括,为保证唯 ...
- 编写自定义的JDBC框架与策略模式
本篇根据上一篇利用数据库的几种元数据来仿造Apache公司的开源DbUtils工具类集合来编写自己的JDBC框架.也就是说在本篇中很大程度上的代码都和DbUtils中相似,学完本篇后即更容易了解DbU ...
- Java 通过 BufferReader 实现 文件 写入读取 示例
package com.javatest.techzero.gui; import java.io.BufferedReader; import java.io.File; import java.i ...
- FireMonkey Style Designer
http://docwiki.embarcadero.com/RADStudio/Berlin/en/FireMonkey_Style_Designer http://docwiki.embarcad ...