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{
00018 template <class charT,class char_traits,class xml_traits>
00019 class SAX_Parser{
00020 public:
00021 MiX_Template_Typedef(charT,char_traits,xml_traits);
00022 typedef SAX_Parser<charT,char_traits,xml_traits> this_type;
00023 typedef XMLToken<charT,char_traits,xml_traits> token_type;
00024 typedef SAX_EventHandler<charT,char_traits,xml_traits> handler_type;
00025 typedef Tokenizer<charT,char_traits,xml_traits> tokenizer_type;
00026 private:
00027 enum State{
00028 STATE_Text,
00029 STATE_Tag,
00030 STATE_Reference,
00031 STATE_Comment,
00032 STATE_Complete,
00033 STATE_Declaration,
00034 STATE_XMLDeclaration,
00035 STATE_CData,
00036 STATE_Escape,
00037 STATE_Exception
00038 };
00039 State state_;
00040 tokenizer_type tokenizer_;
00041 handler_type* handler_;
00042 std::stack<string_type> validator_;
00043
00044 bool ignore_space_;
00045 bool decrared_;
00046
00047 void skipSpaceTokens();
00048
00049 bool parsingLoop();
00050
00051 State parseText();
00052 State parseTag();
00053 State parseComment();
00054 State parseDeclaration();
00055 State parseXMLDeclaration();
00056 State parseCData();
00057
00058 attrmap_type parseAttributes();
00059 string_type parseReference();
00060
00061 void trimRight(string_type& str);
00062 public:
00064 SAX_Parser(){ handler_ = NULL; ignore_space_ = false; }
00071 void setEventHandler(handler_type* handler){
00072 handler_ = handler;
00073 };
00080 void setIgnoreSpace(bool flag) { ignore_space_ = flag; };
00087 bool parse(const string_type& text);
00088 #ifdef MiX_HAS_BASIC_STREAM
00089
00095 bool parse(std::basic_istream<charT, char_traits>& is);
00096 #endif
00097 };
00098 }
00099
00100 #ifndef MiX_SAXPARSER_CPP_
00101 #include "SAX_Parser.cpp"
00102 #endif
00103
00104 #endif