00001
00002
00003
00004 #ifndef MIX_SAXPARSER_H_
00005 #define MIX_SAXPARSER_H_
00006
00007 #include <map>
00008 #include <stack>
00009
00010 #include "classes.h"
00011 #include "misc.h"
00012 #include "Tokenizer.h"
00013 #include "SaxEventHandler.h"
00014 #include "XMLString.h"
00015 #include "AttrMap.h"
00016
00017 namespace MiX{
00022 template <class Char,class Traits,class XMLTraits>
00023 class SaxParser{
00024 enum State{
00025 STATE_Text,
00026 STATE_Tag,
00027 STATE_Reference,
00028 STATE_Comment,
00029 STATE_Complete,
00030 STATE_Declaration,
00031 STATE_XMLDeclaration,
00032 STATE_Escape,
00033 STATE_Exception
00034 };
00035
00036 State m_state;
00037
00038 Tokenizer<Char,Traits,XMLTraits> m_tokenizer;
00039 SaxEventHandler<Char,Traits,XMLTraits>* m_pHandler;
00040 std::stack<XMLString<Char,Traits,XMLTraits> > m_validator;
00041 void skipSpaceTokens();
00042
00044
00045 bool m_bIgnoreSpace;
00046
00047 State parseText();
00048 State parseTag();
00049 State parseComment();
00050 State parseDeclaration();
00051 State parseXMLDeclaration();
00052
00053 AttrMap<Char,Traits,XMLTraits> parseAttributes();
00054 XMLString<Char,Traits,XMLTraits> parseReference();
00055
00056 void trimRight(XMLString<Char,Traits,XMLTraits>& str);
00057 public:
00059 SaxParser();
00066 void setEventHandler(SaxEventHandler<Char,Traits,XMLTraits>* handler);
00073 void setIgnoreSpace(bool bFlag);
00080 bool parse(const Char* szText);
00081 };
00082 }
00083
00084 #ifndef MIX_SAXPARSER_CPP_
00085 #include "SaxParser.cpp"
00086 #endif
00087
00088 #endif