Go to the documentation of this file.00001 #ifndef __SIMPLE_SAX_PARSER_H_
00002 #define __SIMPLE_SAX_PARSER_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <string>
00014 #include <cstdio>
00015 #include <cstdlib>
00016 #include <cassert>
00017 #include <cstring>
00018 #include <iostream>
00019 #include <algorithm>
00020 #include <vector>
00021
00022 bool
00023 fgettoken(std::istream &in, char **buffer, size_t *maxSize, const char *separators,
00024 int *firstChar);
00025
00071 class SimpleSAXParser
00072 {
00073 public:
00074 struct Attribute
00075 {
00076 std::string key;
00077 std::string value;
00078
00079 Attribute(const std::string &iKey, const std::string &iValue)
00080 :key(iKey), value(iValue)
00081 {}
00082
00083 Attribute(const Attribute &attr)
00084 :key(attr.key), value(attr.value)
00085 {}
00086
00087 bool operator<(const Attribute &attribute) const
00088 {
00089 return this->key < attribute.key;
00090 }
00091 };
00092
00093 typedef std::vector<Attribute> Attributes;
00094 class ParserError
00095 {
00096 public:
00097 ParserError(const std::string &error)
00098 :m_error(error)
00099 {}
00100
00101 const char *error() { return m_error.c_str(); }
00102 private:
00103 std::string m_error;
00104 };
00105
00106 enum PARSER_STATES {
00107 IN_DOCUMENT,
00108 IN_BEGIN_TAG,
00109 IN_DONE,
00110 IN_BEGIN_ELEMENT,
00111 IN_ELEMENT_WHITESPACE,
00112 IN_END_ELEMENT,
00113 IN_ATTRIBUTE_KEY,
00114 IN_END_TAG,
00115 IN_DATA,
00116 IN_BEGIN_ATTRIBUTE_VALUE,
00117 IN_STRING,
00118 IN_END_ATTRIBUTE_VALUE,
00119 IN_STRING_ENTITY,
00120 IN_DATA_ENTITY
00121 };
00122
00123 SimpleSAXParser(std::istream &f)
00124 : m_in(f),
00125 m_bufferSize(1024),
00126 m_buffer(new char[m_bufferSize]),
00127 m_nextChar(m_in.get())
00128 {}
00129
00130 virtual ~SimpleSAXParser();
00131
00132 void parse(void);
00133
00134 virtual void startElement(const std::string &,
00135 Attributes &) {}
00136 virtual void endElement(const std::string &) {}
00137 virtual void data(const std::string &) {}
00138 private:
00139 std::string parseEntity(const std::string &entity);
00140 std::string getToken(const char *delim)
00141 {
00142 fgettoken(m_in, &m_buffer, &m_bufferSize, delim, &m_nextChar);
00143 return m_buffer;
00144 }
00145
00146 std::string getToken(const char delim)
00147 {
00148 char buf[2] = {delim, 0};
00149 fgettoken(m_in, &m_buffer, &m_bufferSize, buf, &m_nextChar);
00150 m_nextChar = m_in.get();
00151 return m_buffer;
00152 }
00153
00154 bool skipChar(int c)
00155 {
00156 if (m_nextChar != c)
00157 return false;
00158 m_nextChar = m_in.get();
00159 return true;
00160 }
00161
00162 int nextChar(void) { return m_nextChar; }
00163
00164 std::istream &m_in;
00165 size_t m_bufferSize;
00166 char *m_buffer;
00167 int m_nextChar;
00168 std::vector<std::string> m_elementTags;
00169 Attributes m_attributes;
00170 };
00171
00172
00173 #endif // __SIMPLE_SAX_PARSER_H_