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)

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

猜你喜欢

转载自blog.csdn.net/m0_37601002/article/details/88818622