00001
00002
00003 #ifndef MIX_SAXPARSER_H_
00004 #define MIX_SAXPARSER_H_
00005
00006 #include <map>
00007 #include <stack>
00008
00009 #include "classes.h"
00010 #include "DefaultXMLTraits.h"
00011 #include "misc.h"
00012 #include "Tokenizer.h"
00013 #include "SAX_EventHandler.h"
00014 #include "XMLString.h"
00015 #include "AttrMap.h"
00016
00017 namespace MiX{
00022 template <class charT,class traitsT>
00023 class SAX_Parser{
00024 public:
00025 MiX_Template_Typedef(charT,traitsT);
00026 typedef SAX_Parser<charT,traitsT> this_type;
00027 typedef XMLToken<charT,traitsT> token_type;
00028 typedef SAX_EventHandler<charT,traitsT> handler_type;
00029 typedef Tokenizer<charT,traitsT> tokenizer_type;
00030 typedef typename traitsT::char_traits char_traits;
00031 typedef typename traitsT::xml_traits xml_traits;
00032 private:
00033 enum State{
00034 STATE_Text,
00035 STATE_Tag,
00036 STATE_Reference,
00037 STATE_Comment,
00038 STATE_Complete,
00039 STATE_Declaration,
00040 STATE_XMLDeclaration,
00041 STATE_Escape,
00042 STATE_Exception
00043 };
00044 State state_;
00045 tokenizer_type tokenizer_;
00046 handler_type* handler_;
00047 std::stack<string_type> validator_;
00048
00049 bool ignore_space_;
00050
00051 void skipSpaceTokens();
00052
00053 bool parsingLoop();
00054
00055 State parseText();
00056 State parseTag();
00057 State parseComment();
00058 State parseDeclaration();
00059 State parseXMLDeclaration();
00060
00061 attrmap_type parseAttributes();
00062 string_type parseReference();
00063
00064 void trimRight(string_type& str);
00065 public:
00067 SAX_Parser(){ handler_ = NULL; };
00074 void setEventHandler(handler_type* handler){
00075 handler_ = handler;
00076 };
00083 void setIgnoreSpace(bool flag) { ignore_space_ = flag; };
00090 bool parse(const string_type& text);
00097 bool parse(std::basic_istream<charT, char_traits>& is);
00098 };
00099 }
00100
00101 #ifndef MIX_SAXPARSER_CPP_
00102 #include "SAX_Parser.cpp"
00103 #endif
00104
00105 #endif