本站文章均为 李华明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=
|