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