Mbed port of the Simple Plain Xml parser. See http://code.google.com/p/spxml/ for more details. This library uses less memory and is much better suited to streaming data than TinyXML (doesn\'t use as much C++ features, and especially works without streams). See http://mbed.org/users/hlipka/notebook/xml-parsing/ for usage examples.

Dependents:   spxmltest_weather VFD_fontx2_weather weather_LCD_display News_LCD_display ... more

spxmlreader.hpp

Committer:
hlipka
Date:
2010-11-24
Revision:
0:3fa97f2c0505

File content as of revision 0:3fa97f2c0505:

/*
 * Copyright 2007 Stephen Liu
 * LGPL, see http://code.google.com/p/spxml/
 * For license terms, see the file COPYING along with this library.
 */

#ifndef __spxmlreader_hpp__
#define __spxmlreader_hpp__

class SP_XmlPullParser;
class SP_XmlPullEvent;
class SP_XmlStringBuffer;

class SP_XmlReader {
public:
    enum { MAX_READER = 16 };
    enum { ePI, eDocType, eSTag, eETag, ePCData,
        eCDataSection, eComment, eLBracket, eSign };

    /**
     * @param  parser : act as reader's context
     * @param  c : a char in xml stream
     */
    virtual void read( SP_XmlPullParser * parser, char c ) = 0;

    /**
     * reset reader state
     */
    virtual void reset();

    /**
     * convert internal xml string to event
     * @return NULL : this reader don't generate any event or error occured
     */
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser ) = 0;

protected:
    SP_XmlStringBuffer * mBuffer;

    friend class SP_XmlReaderPool;

    SP_XmlReader();
    virtual ~SP_XmlReader();

    /// help to call parser->changeReader
    void changeReader( SP_XmlPullParser * parser, SP_XmlReader * reader );

    /// help to call parser->getReader
    SP_XmlReader * getReader( SP_XmlPullParser * parser, int type );

    /// help to call parser->setError
    static void setError( SP_XmlPullParser * parser, const char * error );

private:
    SP_XmlReader( SP_XmlReader & );
    SP_XmlReader & operator=( SP_XmlReader & );
};

class SP_XmlPIReader : public SP_XmlReader {
public:
    SP_XmlPIReader();
    virtual ~SP_XmlPIReader();
    virtual void read( SP_XmlPullParser * parser, char c );
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser );

private:
    static SP_XmlPullEvent * parseDocDeclEvent( SP_XmlPullParser * parser,
            SP_XmlStringBuffer * buffer );
};

class SP_XmlStartTagReader : public SP_XmlReader {
public:
    SP_XmlStartTagReader();
    virtual ~SP_XmlStartTagReader();
    virtual void read( SP_XmlPullParser * parser, char c );
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser );
    virtual void reset();

private:
    int mIsQuot;
};

class SP_XmlEndTagReader : public SP_XmlReader {
public:
    SP_XmlEndTagReader();
    virtual ~SP_XmlEndTagReader();
    virtual void read( SP_XmlPullParser * parser, char c );
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser );
};

class SP_XmlPCDataReader : public SP_XmlReader {
public:
    SP_XmlPCDataReader();
    virtual ~SP_XmlPCDataReader();
    virtual void read( SP_XmlPullParser * parser, char c );
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser );
};

class SP_XmlCDataSectionReader : public SP_XmlReader {
public:
    SP_XmlCDataSectionReader();
    virtual ~SP_XmlCDataSectionReader();
    virtual void read( SP_XmlPullParser * parser, char c );
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser );
};

class SP_XmlCommentReader : public SP_XmlReader {
public:
    SP_XmlCommentReader();
    virtual ~SP_XmlCommentReader();
    virtual void read( SP_XmlPullParser * parser, char c );
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser );
};

class SP_XmlDocTypeReader : public SP_XmlReader {
public:
    SP_XmlDocTypeReader();
    virtual ~SP_XmlDocTypeReader();
    virtual void read( SP_XmlPullParser * parser, char c );
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser );
};

class SP_XmlLeftBracketReader : public SP_XmlReader {
public:
    SP_XmlLeftBracketReader();
    virtual ~SP_XmlLeftBracketReader();
    virtual void read( SP_XmlPullParser * parser, char c );
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser );
    virtual void reset();

private:
    int mHasReadBracket;
};

class SP_XmlSignReader : public SP_XmlReader {
public:
    SP_XmlSignReader();
    virtual ~SP_XmlSignReader();
    virtual void read( SP_XmlPullParser * parser, char c );
    virtual SP_XmlPullEvent * getEvent( SP_XmlPullParser * parser );
};

class SP_XmlReaderPool {
public:
    SP_XmlReaderPool();
    ~SP_XmlReaderPool();
    SP_XmlReader * borrow( int type );
    void save( SP_XmlReader * reader );

private:
    SP_XmlReader ** mReaderList;
};

#endif