解析方法有两种,一种需要添加解析类CCSAXParser解析器,一种是cocos2dx自带CCUserDefault
一 : 添加解析类CCSAXParser解析器
两个解析类及获取字符串代码如下
#ifndef __XML_PARSER_H__
#define __XML_PARSER_H__
#include
#include "cocos2d.h"
NS_CC_BEGIN
class XMLParser :public CCObject ,public CCSAXDelegator
{
public:
XMLParser();
~XMLParser();
CCDictionary *m_pDict;
CCArray m_oDictDataArr;
static XMLParser *parserWithFile(const char *pTmxFile);
bool initXmlParse(const char* xmlName); //本地xml、文件中读取
// 使用 CCSAXDelegator 重写3个回调函数
void startElement(void *ctx, const char *name, const char **atts);
void endElement(void *ctx, const char *name);
void textHandler(void *ctx, const char *ch, int len);
cocos2d::CCString* getString(const char *key);//改
const char* GetStringByKey(const char* keyword);
private:
std::string m_strRoot_name;
std::string m_strFirstKey;
bool isJumpHeadData;
std::string startXmlElement;//用来记录每个key前字段
std::string endXmlElement;//用来记录每个key后字段
std::string currString;//记录每个value的值
};
NS_CC_END
#endif
#include "XMLParser.h"
USING_NS_CC;
using namespace std;
XMLParser::XMLParser():
m_pDict(NULL),
m_oDictDataArr()
{
}
XMLParser::~XMLParser()
{
}
XMLParser *XMLParser::parserWithFile(const char *pTmxFile)
{
XMLParser *pRet = new XMLParser();
if(pRet->initXmlParse(pTmxFile))
{
pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}
bool XMLParser::initXmlParse(const char* pXmlName)
{
CCSAXParser pXMLParser;
m_pDict = CCDictionary::create();
if (false == pXMLParser.init("UTF-8") )
{
CCLog("-----请使用utf-8格式!");
return false;
}
pXMLParser.setDelegator(this);
std::string strPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(pXmlName);
bool ret = pXMLParser.parse( strPath.c_str() );
return ret ;
}
// 使用 CCSAXDelegator 重写3个回调函数
void XMLParser::startElement(void *ctx, const char *name, const char **atts)
{
CC_UNUSED_PARAM(ctx);
startXmlElement = (char*)name;
if( isJumpHeadData ){//不跳过数据头
CCLog("------跳过root name");
isJumpHeadData = false;
m_strRoot_name = startXmlElement;
return;
}
}
void XMLParser::endElement(void *ctx, const char *name)
{
CC_UNUSED_PARAM(ctx);
endXmlElement = (char*)name;
if( endXmlElement == m_strRoot_name ){//数据尾
CCLog("读取xml结束");
isJumpHeadData = true;
m_strRoot_name = "";
return;
}
}
void XMLParser::textHandler(void *ctx, const char *ch, int len)
{
CC_UNUSED_PARAM(ctx);
currString = std::string((char*)ch,0,len);
CCString *ccStr = new CCString();//备注3
ccStr->m_sString = currString;
if( m_strRoot_name!="" )
{
if( m_strRoot_name != startXmlElement )
{
if(m_strFirstKey == "") //如果第一个key值为空 就保存下这个key
{
m_strFirstKey = startXmlElement;
m_oDictDataArr.addObject(m_pDict);
}else if(m_strFirstKey == startXmlElement) //说明一组key已经读取完毕,需要保存到数组中
{ //字典加到数组中
m_pDict = CCDictionary::create();
m_oDictDataArr.addObject(m_pDict);
}
m_pDict->setObject(ccStr,startXmlElement);
ccStr->release();
}
CCLog("-----key:%s, value:%s",startXmlElement.c_str(),dynamic_cast
(m_pDict->objectForKey(startXmlElement))->m_sString.c_str());
}
}
CCString* XMLParser::getString(const char *key)
{
string strKey(key);
return (CCString *)(this->m_pDict->valueForKey(key));
}
const char* XMLParser::GetStringByKey(const char* keyword)
{
return ((CCString*)(this->m_pDict->objectForKey(keyword)))->m_sString.c_str();
}
//读取字符串信息(无法显示中文,需要添加库)----------------------------
XMLParser *pXmlParser = XMLParser::parserWithFile("strings.xml");
CCString *pValue1 = pXmlParser->getString("string");
CCString *pValue2 = pXmlParser->getString("person");
CCLOG("asdfasf %s", pValue1->m_sString.c_str());
CCString *pValue = CCString::createWithFormat("%s%s%s%s", "XML: ", pValue1->getCString(), ",", pValue2->getCString());
CCLabelTTF* pLabel2 = CCLabelTTF::create(pValue->getCString(), "Arial", 30);
pLabel2->setColor(ccWHITE);
pLabel2->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2));
this->addChild(pLabel2,2);
//读取以 , 分割的坐标信息----------------------------------
CCString *xarry =pXmlParser->getString("xarry");
CCString *yarry = pXmlParser -> getString("yarry");
float arrayx[10];
float arrayy[10];
int t=0;
char *px=strtok(const_cast
(xarry->m_sString.c_str()),","); //以 , 分割字符串 ( char-> char 内部强制转换)
while (px != NULL&&t<=10)
{
// CCLOG("( %s )\n",px);
arrayx[t]=atof(px);
px = strtok (NULL, ","); //下一个字符串
t++;
}
char *py=strtok(const_cast
(yarry->m_sString.c_str()),",");
t=0;
while (py!=NULL&&t<=10)
{
// CCLOG("( %s )\n",py);
arrayy[t]=atof(py);
py= strtok (NULL, ",");
CCLOG("(%.2f %.2f)",arrayx[t],arrayy[t]);
t++;
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">hello</string>
<person name="name">Xml</person>
<xarry name="x">1.5,2,3,4,5,6,7,8,9</xarry>
<yarry name="y">9,8,7,6,5,4,3,2,1,8</yarry>
</resources>
<resources>
<string name="hello">hello</string>
<person name="name">Xml</person>
<xarry name="x">1.5,2,3,4,5,6,7,8,9</xarry>
<yarry name="y">9,8,7,6,5,4,3,2,1,8</yarry>
</resources>
二:CCUserDefault解析
CCUserDefault::sharedUserDefault()->setStringForKey("xarray", "80,100,120,140,160");//保存字符串到UserDefault.xml中
CCUserDefault::sharedUserDefault()->flush();//这里一定要提交写入哦,否则不会记录到xml中,下次启动游戏你就获取不到value了。
CCLog("***********%s************",CCUserDefault::sharedUserDefault()->getStringForKey("xarray").c_str());
CCLog("***********************path= %s**********************",CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str());
float arrayx[5];
int t=0;
std::string d=CCUserDefault::sharedUserDefault()->getStringForKey("xarray");
CCLog("string %s",CCUserDefault::sharedUserDefault()->getStringForKey("xarray").c_str());
char *px=strtok(const_cast
(d.c_str()),",");//const char->char
while (px != NULL&&t<=5)
{
// CCLOG("( %s )\n",px);
arrayx[t]=atof(px);
px = strtok (NULL, ",");
CCLOG("(%.2f)",arrayx[t]);
t++;
}
UserDefault.xml (文件目录--proj.win32\Debug.win32)
<?xml version="1.0" encoding="UTF-8"?>
<userDefaultRoot>
<key>himi</key>
<xarray>80,100,120,140,160</xarray>
</userDefaultRoot>