00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __CXMLELEMENT_H
00019 #define __CXMLELEMENT_H
00020
00021 #include <string>
00022 #include <map>
00023 #include <vector>
00024 #include "defs.h"
00025
00026 class cXMLElement;
00027 class cModule;
00028
00032 typedef std::vector<cXMLElement*> cXMLElementList;
00033
00037 typedef std::map<std::string,std::string> cXMLAttributeMap;
00038
00039
00071
00072 class SIM_API cXMLElement
00073 {
00074 public:
00079 class SIM_API ParamResolver
00080 {
00081 public:
00087 virtual bool resolve(const char *paramname, std::string& value) = 0;
00088 virtual ~ParamResolver() {}
00089 };
00090
00091 private:
00092 std::string ename;
00093 std::string srcloc;
00094 std::string value;
00095 cXMLAttributeMap attrs;
00096 cXMLElement *parent;
00097 cXMLElement *firstchild;
00098 cXMLElement *lastchild;
00099 cXMLElement *prevsibling;
00100 cXMLElement *nextsibling;
00101
00102 private:
00103 void doGetElementsByTagName(const char *tagname, cXMLElementList& list) const;
00104
00105 public:
00106
00107 cXMLElement(const char *tagname, const char *srcloc, cXMLElement *parent);
00108
00109
00110 virtual void setNodeValue(const char *s, int len);
00111
00112
00113 virtual void appendNodeValue(const char *s, int len);
00114
00115
00116 virtual ~cXMLElement();
00117
00118
00119 virtual void setAttribute(const char *attr, const char *value);
00120
00121
00122 virtual void appendChild(cXMLElement *node);
00123
00124
00125
00126 virtual void insertChildBefore(cXMLElement *where, cXMLElement *newnode);
00127
00128
00129
00130 virtual cXMLElement *removeChild(cXMLElement *node);
00131
00132
00133 static cXMLElement *getDocumentElementByPath(cXMLElement *documentnode, const char *pathexpr, ParamResolver *resolver=NULL);
00134
00137
00141 virtual const char *getTagName() const;
00142
00147 virtual const char *getSourceLocation() const;
00148
00153 virtual const char *getNodeValue() const;
00154
00159 virtual const char *getAttribute(const char *attr) const;
00160
00164 virtual bool hasAttributes() const;
00165
00169 virtual const cXMLAttributeMap& getAttributes() const;
00171
00177 virtual cXMLElement *getParentNode() const;
00178
00182 virtual bool hasChildren() const;
00183
00188 virtual cXMLElement *getFirstChild() const;
00189
00194 virtual cXMLElement *getLastChild() const;
00195
00211 virtual cXMLElement *getNextSibling() const;
00212
00218 virtual cXMLElement *getPreviousSibling() const;
00219
00224 virtual cXMLElement *getFirstChildWithTag(const char *tagname) const;
00225
00240 virtual cXMLElement *getNextSiblingWithTag(const char *tagname) const;
00241
00245 virtual cXMLElementList getChildren() const;
00246
00250 virtual cXMLElementList getChildrenByTagName(const char *tagname) const;
00251
00256 virtual cXMLElementList getElementsByTagName(const char *tagname) const;
00258
00267 cXMLElement *getFirstChildWithAttribute(const char *tagname, const char *attr, const char *attrvalue=NULL) const;
00268
00274 cXMLElement *getElementById(const char *idattrvalue) const;
00275
00305 cXMLElement *getElementByPath(const char *pathexpression, cXMLElement *root=NULL, ParamResolver *resolver=NULL) const;
00306
00313 void debugDump(int depth=0) const;
00315 };
00316
00324 class SIM_API ModNameParamResolver : public cXMLElement::ParamResolver
00325 {
00326 protected:
00327 cModule *mod;
00328 public:
00329 ModNameParamResolver(cModule *mod) {this->mod = mod;}
00330 virtual bool resolve(const char *paramname, std::string& value);
00331 };
00332
00338 class SIM_API StringMapParamResolver : public cXMLElement::ParamResolver
00339 {
00340 public:
00341 typedef std::map<std::string,std::string> StringMap;
00342 protected:
00343 StringMap params;
00344 public:
00345 StringMapParamResolver(const StringMap& m) {params = m;}
00346 virtual bool resolve(const char *paramname, std::string& value);
00347 };
00348
00349 #endif
00350