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)
而且这三个函数的调用自身是没有循序关系的,完完全全按照文本从上到下,从左到右,的顺序执行碰到什么就调用哪个函数。