00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef XML_Parser_hh_
00010 #define XML_Parser_hh_
00011
00012 #include <xml/Streamer.hh>
00013 #include <xml/Tokenizer.hh>
00014 #include <map>
00015
00016 namespace XML {
00017
00018 class Parser
00019 {
00020 public:
00021
00022 class Node {
00023 public:
00024 enum Type{
00025 eDecl,
00026 eSpecial,
00027 eTag,
00028 eString
00029 };
00030
00031 Node(void) : mChild(0), mSibling(0) {}
00032 ~Node(void);
00033
00034 Node* getFirstChild() const {return mChild;}
00035 Node* getNextSibling() const {return mSibling;}
00036 std::string getTagAttribute(const std::string& inName) const;
00037 const std::string& getTagName() const {return mValue;}
00038 Type getType() const {return mType;}
00039 std::string getValue() const {return mValue;}
00040 void serialize(Streamer& outStream, bool inIndent=true) const;
00041
00042 protected:
00043 Type mType;
00044 std::string mValue;
00045 std::map<std::string,std::string> mAttributes;
00046 Node* mChild;
00047 Node* mSibling;
00048
00049 static Node* parse(Tokenizer& inTokenizer);
00050 void parseAttributeList(Tokenizer& inTokenizer, std::string& outToken);
00051 void parseStartTag(Tokenizer& inTokenizer, std::string& outToken);
00052 void throwError(Tokenizer& inTokenizer, const std::string& inMessage) const;
00053
00054 friend class Parser;
00055
00056
00057 private:
00058 Node(const Node&);
00059 void operator=(const Node&);
00060 };
00061
00062 public:
00063 Parser(void) : mRoot(0) {}
00064 ~Parser(void) {if(mRoot) delete mRoot;}
00065
00066 Node* getRootNode() const {return mRoot;}
00067
00068 void parse(const std::string& inFileName);
00069 void parse(std::istream& inStream, const std::string& inName="");
00070
00071 protected:
00072 Node* mRoot;
00073
00074
00075 private:
00076
00077 Parser(const Parser&);
00078 void operator=(const Parser&);
00079 };
00080
00081 };
00082
00083 #endif // XML_Parser_hh_
00084
00085