首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Cocos2d-x 利用 CCSAXParser 解析 XML:跨平台數據存取封裝實戰

     編輯:關於C語言

背景與選型

Cocos2d-x 內建 libxml2(iOS 用系統庫,Android/Win32 附帶預編譯庫),引擎提供 CCSAXParser 封裝 SAX 事件回調。為實現跨平台遊戲數據存取(替代 Plist、二進制),作者基於 CCSAXDelegator 封裝 HXmlParse 類,支援鍵值對 XML 解析。

HXmlParse 類設計


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;
};

回調邏輯詳解

  1. startElement:遇到根節點(如 <himiTestData>)時標記並跳過;後續記錄每個鍵名至 startXmlElement;
  2. textHandler:獲取鍵對應的值,構造 CCString 存入 mDic,鍵為 startXmlElement;
  3. endElement:遇到根節點結束標記時重置狀態。

關鍵坑點提示

  • CCMutableDictionary::setObject 參數順序:setObject(value, key),**值在前,鍵在後**,與 Java/STL 相反;
  • 值必須為 CCObject 子類**:不可直接存 std::string,需包裝為 CCString;
  • 避免複用同一 CCString 實例**:setObject 內部會 retain(),循環中複用同一對象會導致字典所有鍵指向最後一個值,**每次 new 新對象**;
  • 鍵重複不覆蓋**:底層用 std::map,同鍵再次插入會被忽略,不同於 NSMutableDictionary 的覆蓋行為。

測試 XML 與調用


<?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 實測均正常運行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved