00001 # ifndef _DataObject_h__included__
00002 # define _DataObject_h__included__
00003
00005
00006
00007
00008
00009
00010
00012
00013 # include <string>
00014 # include <vector>
00015 # include <map>
00016 # include <iostream>
00017
00018 # include <stack>
00019
00020 #ifdef OLDSTREAMS
00021 # include <strstream>
00022 # define ostringstream ostrstream
00023 # define istringstream istrstream
00024 #else
00025 # include <sstream>
00026 #endif
00027
00028 namespace DataXML
00029 {
00030
00061 class DataObject
00062 {
00063 public:
00064
00066 DataObject();
00067
00069 DataObject(std::string name);
00070
00072
00073 std::string name() const;
00074 void setName(std::string name);
00076
00078
00079
00080 bool appendAttribute(std::string attr_name, std::string attr_val);
00081
00083 void setAttribute(std::string attr_name, std::string attr_val);
00084
00086 void removeAttribute(std::string attr_name);
00087
00089 std::string getAttributeValue(std::string attr_name) const;
00091
00093
00095
00096 void appendChild(const DataObject& elem);
00097
00100 DataObject* getChild(std::string child_name);
00101
00104 const DataObject* getChild(std::string child_name) const;
00105
00107 DataObject* firstChild();
00108 const DataObject* firstChild() const;
00109
00111 DataObject* lastChild();
00112 const DataObject* lastChild() const;
00113
00115
00116
00118
00119
00120 void appendChildText(std::string text);
00121
00123 std::string getText() const;
00125
00126
00128
00129 std::vector<DataObject>& children();
00130 const std::vector<DataObject>& children() const;
00132
00133
00134
00135
00137
00138
00139 std::map<std::string,std::string>& attributes();
00140 const std::map<std::string,std::string>& attributes() const;
00142
00143 static const DataObject& the_void_object();
00144
00145 private:
00146
00147 std::string m_name;
00148
00149 std::map<std::string,std::string> m_attr;
00150 std::vector<DataObject> m_child;
00151
00152 };
00153
00157 DataObject TextDataObject(std::string text);
00158
00159
00165 template<class T>
00166 std::string to_string(T val)
00167 {
00168 std::ostringstream buf;
00169 buf << val;
00170 #ifndef BADENDS
00171 buf << std::ends;
00172 #endif
00173 std::string ret = buf.str();
00174 return ret;
00175 }
00176
00182 template<class T>
00183 bool to_value(std::string s, T& val)
00184 {
00185 std::istringstream buf( s.c_str() );
00186 buf >> std::ws;
00187 if ( buf.eof() || (! buf.good() ) ) return false;
00188 buf >> val;
00189 return true;
00190 }
00191
00204 class DataObjectTreeCreator
00205 {
00206 public:
00207
00208 DataObjectTreeCreator() : m_current_obj(0), m_parent_stack(), m_root_obj(), m_finished(false) {}
00209
00211 bool empty();
00212
00214 bool finished();
00215
00217 DataObject* root();
00218
00220 DataObject* current();
00221
00224 void createAndOpenSubObject();
00225
00227 void backToParent();
00228
00231 void appendTextAsSubObject();
00232
00234 std::string current_freemarkup();
00235
00236 void append_next_freemarkup_segment(std::string text);
00237
00238
00239 private:
00240
00241 DataObject *m_current_obj;
00242 std::stack<DataObject*> m_parent_stack;
00243 DataObject m_root_obj;
00244 bool m_finished;
00245 std::string m_freemarkup_buffer;
00246 };
00247
00248 }
00249
00250 # endif