Cocos2d-x 內建 libxml2(iOS 用系統庫,Android/Win32 附帶預編譯庫),引擎提供 CCSAXParser 封裝 SAX 事件回調。為實現跨平台遊戲數據存取(替代 Plist、二進制),作者基於 CCSAXDelegator 封裝 HXmlParse 類,支援鍵值對 XML 解析。
class HXmlParse : public CCObject, public CCSAXDelegator {
public:
static HXmlParse* parserWithFile(const char* xmlName);
bool initHXmlParse(const char* xmlName);
// SAX 回調
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);
CCMutableDictionary<std::string, CCString*>* mDic; // 解析結果
private:
std::string startXmlElement, endXmlElement, currString;
std::string root_name;
bool isJumpHeadData;
};
<himiTestData>)時標記並跳過;後續記錄每個鍵名至 startXmlElement;CCString 存入 mDic,鍵為 startXmlElement;setObject(value, key),**值在前,鍵在後**,與 Java/STL 相反;std::string,需包裝為 CCString;setObject 內部會 retain(),循環中複用同一對象會導致字典所有鍵指向最後一個值,**每次 new 新對象**;std::map,同鍵再次插入會被忽略,不同於 NSMutableDictionary 的覆蓋行為。
<?xml version="1.0" encoding="utf-8"?>
<himiTestData>
<key1>1000</key1>
<key2>娃哈哈</key2>
<key3>82.3</key3>
<key4>4000</key4>
<key5>himi</key5>
<key6>true</key6>
</himiTestData>
// 一行調用
HXmlParse::parserWithFile("himi.xml");
解析結果存入 mDic,可直接 mDic->objectForKey("key1")->m_sString 取值。iOS/Android 實測均正常運行。