cocos2dx 3.17.1 CCSAXParser文件 SAXParser類學習

SAXParser類的結構很簡單:

有一個成員變量:

 CCSAXDelegator*    m_pDelegator;

有七個主要函數:

    bool init(const char *pszEncoding);
    bool parse(const char* pXMLData, unsigned int uDataLength);
    bool parse(const char *pszFile);
    void setDelegator(CCSAXDelegator* pDelegator);

    static void startElement(void *ctx, const CC_XML_CHAR *name, const CC_XML_CHAR **atts);
    static void endElement(void *ctx, const CC_XML_CHAR *name);
    static void textHandler(void *ctx, const CC_XML_CHAR *name, int len);

 

我們分析可以看出成員變量m_pDelegator指針的類CCSAXDelegator 是一個純虛類。

並且SAXParser類中三個起主要作用的函數

    static void startElement(void *ctx, const CC_XML_CHAR *name, const CC_XML_CHAR **atts);
    static void endElement(void *ctx, const CC_XML_CHAR *name);
    static void textHandler(void *ctx, const CC_XML_CHAR *name, int len);

這三個函數其實是通過指針m_pDelegator去調用CCSAXDelegator類中分別對應的三個虛函數。

使用方法:

1.首先定義CCSAXDelegator類的一個子類,假設爲ChildCCSAXDelegator並且需要我們去實現父類的三個純虛函數

然後如何使用代碼:

  1.   SAXParser                         aaa;//定義類
  2.  ChildCCSAXDelegator     bbb;//定義類

  3.  aaa.setDelegator(&bbb);     //把bbb的指針和aaa綁定  

  4. aaa.parse("文件路徑");   //注意第三行和第四行代碼不能交換,因爲第四行代碼執行中,它會找到和aaa綁定的bbb的指針,並且通過bbb指針去調用bbb的函數。如果先執行第四行,那麼aaa會找不到和自己綁定的指針,就會報錯。

關鍵點來了,在第四行代碼執行時,aaa會找到自己綁定的bbb指針,並且通過bbb指針調用bbb的三個虛函數:

    virtual void startElement(void *ctx, const char *name, const char **atts);

    virtual void endElement(void *ctx, const char *name);

    virtual void textHandler(void *ctx, const char *s, size_t len);

而這三個虛函數,其實我們已經實現了。bbb會調用這三個虛函數,通過這三個虛函數,我們可以接受到xml文件的文本。當然獲取了文本我們需要把文本保存下來。那麼就需要我們在bbb的ChildCCSAXDelegator類中,自己去定義保存容器,去把獲取的文本保存下來。之後我們便可以通過bbb指針來獲取保存在容器中的數據了。

三個虛函數調用時具體傳回來的那些參數是啥?

我們假如xml文件格式  <demo>sdfs</demo> 一般是這樣成對出現的。

然後函數的調用就是根據xml,從上往下,從做到右。

當碰到<demo> 就調用startElement ,並且name參數爲demo

當碰到sdfs就會調用textHandler 並且s參數爲 sdfs

當碰到</demo>就調用endElement 並且name爲demo (注意是demo 不是/demo)

而且這三個函數的調用自身是沒有循序關係的,完完全全按照文本從上到下,從左到右,的順序執行碰到什麼就調用哪個函數。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章