00001 #ifndef _FL_XMLNODE_H_
00002 #define _FL_XMLNODE_H_
00003
00004 #include <efltk/Fl_Buffer.h>
00005 #include <efltk/Fl_Map.h>
00006 #include "Fl_XmlNode_List.h"
00007
00008 class Fl_XmlDoc;
00009 class Fl_XmlNode;
00010
00015
00019 class Fl_XmlAttributes : public Fl_String_String_Map {
00020 public:
00021 typedef Fl_String_String_Iterator Iterator;
00022
00026 Fl_XmlAttributes() { }
00027
00032 Fl_XmlAttributes& operator = (const Fl_XmlAttributes& src);
00033
00039 bool has_attribute(const char *attr) const { return contains(attr); }
00040
00047 Fl_String &get_attribute(const char *attr) const { return get_value(attr); }
00048
00055 void set_attribute(const char *attr, const char *value) { set_value(attr, value); }
00056
00063 void set_attribute(const char *attr, const Fl_String &value) { set_value(attr, value); }
00064 };
00065
00067 class Fl_XmlNode
00068 {
00069 public:
00071 enum NodeTypes {
00072 DOM_DOCUMENT = 1,
00073 DOM_ELEMENT,
00074 DOM_PI,
00075 DOM_TEXT,
00076 DOM_CDATA_SECTION,
00077 DOM_COMMENT
00078 };
00079
00083 virtual ~Fl_XmlNode();
00084
00088 virtual void clear();
00089
00094 Fl_XmlNode *parent() const { return m_parent; }
00095
00099 Fl_XmlDoc *document() const { return m_document; }
00100
00104 int type() const { return m_nodetype; }
00105
00107 bool is_document() const { return (type()==DOM_DOCUMENT); }
00109 bool is_element() const { return (type()==DOM_ELEMENT); }
00111 bool is_leaf() const { return (type()==DOM_ELEMENT) && !has_child_nodes(); }
00113 bool is_pi() const { return (type()==DOM_PI); }
00115 bool is_comment() const { return (type()==DOM_COMMENT); }
00117 bool is_text() const { return (type()==DOM_TEXT); }
00119 bool is_cdata_section() const { return (type()==DOM_CDATA_SECTION); }
00120
00133 const Fl_String &name() const { return m_name; }
00135 void name(const Fl_String &name) { m_name = name; }
00137 void name(const char *name) { m_name = name; }
00138
00151 Fl_String &value() { return m_value; }
00152
00158 void value(const Fl_String &new_value) { m_value = new_value; }
00159
00165 void value(const char *new_value) { m_value = new_value; }
00166
00172 void text(Fl_String &ret);
00173
00179 Fl_XmlNode *child(const char *name, bool recursive=true) const;
00180
00185 Fl_XmlNode_List nodes(const char *name);
00186
00192 Fl_XmlNode *clone_node(bool deep=false);
00193
00199 Fl_XmlNode *remove_child(Fl_XmlNode *old_child);
00200
00206 Fl_XmlNode *replace_child(Fl_XmlNode *new_child, Fl_XmlNode *old_child);
00207
00213 Fl_XmlNode *append_child(Fl_XmlNode *new_child);
00214
00221 Fl_XmlNode *insert_before(Fl_XmlNode *new_child, Fl_XmlNode *ref_child);
00222
00224
00225
00229 const Fl_XmlNode_List &child_nodes() const { return m_child_nodes; }
00230
00234 unsigned children() const { return m_child_nodes.size(); }
00235
00239 bool has_child_nodes() const { return m_child_nodes.size()>0; }
00240
00244 Fl_XmlNode *child(int index) const { return m_child_nodes.item(index); }
00245
00247
00248
00249
00250
00251
00252
00253 const Fl_XmlAttributes &attributes() const { return m_attributes; }
00254
00258 bool has_attributes() const { return (m_attributes.size()>0); }
00259
00264 bool has_attribute(const char *attr) const { return m_attributes.has_attribute(attr); }
00265
00272 Fl_String &get_attribute(const char *attr) const { return m_attributes.get_attribute(attr); }
00273
00280 void set_attribute(const char *attr, const char *value) { m_attributes.set_attribute(attr, value); }
00281
00288 void set_attribute(const char *attr, const Fl_String &value) { m_attributes.set_attribute(attr, value); }
00289
00295 virtual void save(Fl_Buffer &buffer, int indent=0);
00296
00297 protected:
00298
00299 Fl_String m_name;
00300 Fl_String m_value;
00301
00302
00303 Fl_XmlAttributes m_attributes;
00304
00305
00306 uchar m_nodetype;
00307
00308
00309 Fl_XmlDoc *m_document;
00310
00311
00312 Fl_XmlNode *m_parent;
00313
00314
00315 Fl_XmlNode_List m_child_nodes;
00316
00317 private:
00318 friend class Fl_XmlParser;
00319 friend class Fl_XmlDoc;
00320
00321
00322 void parent(Fl_XmlNode *p) { m_parent = p; }
00323 void type(int type) { m_nodetype = (uchar)type; }
00324 Fl_XmlNode(Fl_XmlDoc *doc);
00325
00326
00327 Fl_XmlNode(const Fl_String &name, int type, Fl_XmlDoc *doc) { m_name = name; m_nodetype = (uchar)type; m_document = doc; m_parent = 0; }
00328
00329
00330 Fl_XmlNode(const Fl_XmlNode &node) { }
00331 Fl_XmlNode& operator = (const Fl_XmlNode& s) { return *this; }
00332 };
00333
00334 #define FL_XML_TYPE_DOC Fl_XmlNode::DOM_DOCUMENT
00335 #define FL_XML_TYPE_ELEMENT Fl_XmlNode::DOM_ELEMENT
00336 #define FL_XML_TYPE_PI Fl_XmlNode::DOM_PI
00337 #define FL_XML_TYPE_TEXT Fl_XmlNode::DOM_TEXT
00338 #define FL_XML_TYPE_CDATA_SECTION Fl_XmlNode::DOM_CDATA_SECTION
00339 #define FL_XML_TYPE_COMMENT Fl_XmlNode::DOM_COMMENT
00340
00343 #endif