【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!


本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/694.html

          ☞ 点击订阅 ☜
 本博客最新动态!及时将最新博文通知您!

本章Himi给大家分享如何在Cocos2dX中解析xml数据;对于数据存取有很多方式,流文件,plist,xml等,那么为了跨平台更好的支持,Himi想到之前写的CCUserDefault 存储数据一节,Cocos2dx自带的存储类,一旦存入数据都会以xml格式进行保存,适用于iOS、Android等平台,所以这里Himi使用xml进行游戏的一些数据录入  = =.. 另外一方面Himi本章节也是基于Cocos2dx引擎代码进行的一次简单对xml数据解析的封装;

为了更保险的去考虑跨平台,所以对于xml存储这块的解析,也做了些搜索,最后发现王哥(王哲-cocos2dx引擎作者)也有给我们提示过,内容如下:

1
2
3
cocos2dx里面集成了libxml2,ios上会调用sdk里面内置的,
android和win32上则带了已经编译好的静态/动态库。
你可以参考CCSAXParser里面的代码来使用libxml2

那么既然如此,就对Cocos2dx引擎源码的CCSAXParser类进行了剖析,那么这里Himi,先给出代码,然后再详细讲解下:

Himi封装的HXmlParse类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
HXmlParse.h
 
//
//  HXmlParse.h
//  HAnimation
//
//  Created by Himi on 12-3-22.
//  Copyright (c) 2012年 Augustimpression. All rights reserved.
//
 
#ifndef HAnimation_HXmlParse_h
#define HAnimation_HXmlParse_h
 
#include "cocos2d.h"
#include "CCSAXParser.h"
#include "CCObject.h"
#include "CCMutableDictionary.h"
 
using namespace cocos2d;
 
class CC_DLL HXmlParse : public CCObject, public CCSAXDelegator
{
 
public :
 
     static HXmlParse * parserWithFile( const char *tmxFile);
 
     bool initHXmlParse( const char * xmlName);
 
     //  使用 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);
 
     std::string root_name;
 
     bool isJumpHeadData;
 
     CCMutableDictionary<std::string,CCString*> *mDic;
 
private :
 
     std::string startXmlElement; //用来记录每个key前字段
 
     std::string endXmlElement; //用来记录每个key后字段
 
     std::string currString; //记录每个value的值
 
};
 
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
HXmlParse.cpp
 
//
//  HXmlParse.cpp
//  HAnimation
//
//  Created by Himi on 12-3-22.
//  Copyright (c) 2012年 Augustimpression. All rights reserved.
//
 
#include "HXmlParse.h"
#include "CCSAXParser.h"
 
HXmlParse * HXmlParse::parserWithFile( const char *tmxFile)
{
     HXmlParse *pRet = new HXmlParse();
     if (pRet->initHXmlParse(tmxFile))
     {
         pRet->autorelease();
         return pRet;
     }
     CC_SAFE_DELETE(pRet);
     return NULL;
}
 
bool HXmlParse::initHXmlParse( const char * xmlName)
 
{
 
     mDic = new CCMutableDictionary<std::string,CCString*>();
 
     CCSAXParser _par; 
 
     if ( false == _par.init( "UTF-8" ) )
 
     {
         CCLog( "-----请使用utf-8格式!" );
         return false ;
     }
     _par.setDelegator( this );
     const char * _path =CCFileUtils::fullPathFromRelativePath(xmlName);
     return _par.parse(_path);
 
}
 
//回调函数
 
void HXmlParse::startElement( void *ctx, const char *name, const char **atts)
 
{  
 
     CC_UNUSED_PARAM(ctx);
 
     startXmlElement = ( char *)name;
     if (!isJumpHeadData){ //跳过数据头
         CCLog( "------跳过root name" );
         isJumpHeadData= true ;
         root_name=startXmlElement;
         return ;
     }
 
//    CCLog("-startElement----%s",startXmlElement.c_str());
 
}
 
void HXmlParse::endElement( void *ctx, const char *name)
 
{
     CC_UNUSED_PARAM(ctx);
 
     endXmlElement = ( char *)name;
     if (endXmlElement==root_name){ //数据尾
         CCLog( "读取xml结束" );
         isJumpHeadData= false ;
         root_name=

你可能感兴趣的:(游戏,xml,android,String,object,引擎)