ARC SDK
XMLNode.h
1 // -*- indent-tabs-mode: nil -*-
2 
3 #ifndef __ARC_XMLNODE_H__
4 #define __ARC_XMLNODE_H__
5 
6 #include <iostream>
7 #include <string>
8 #include <list>
9 #include <vector>
10 #include <map>
11 
12 #include <libxml/xmlmemory.h>
13 #include <libxml/tree.h>
14 #include <libxml/parser.h>
15 #include <libxml/xpath.h>
16 #include <libxml/xpathInternals.h>
17 #include <libxml/xmlschemas.h>
18 
19 namespace Arc {
20 
24  class XMLNode;
25 
27 
28  class NS
29  : public std::map<std::string, std::string> {
30  public:
32  NS(void) {}
34  NS(const char *prefix, const char *uri) {
35  operator[](prefix) = uri;
36  }
38 
40  NS(const char *nslist[][2]) {
41  for (int n = 0; nslist[n][0]; ++n)
42  operator[](nslist[n][0]) = nslist[n][1];
43  }
45  NS(const std::map<std::string, std::string>& nslist)
46  : std::map<std::string, std::string>(nslist) {}
47  };
48 
49  typedef std::list<XMLNode> XMLNodeList;
50 
52 
61  class XMLNode {
62  friend bool MatchXMLName(const XMLNode& node1, const XMLNode& node2);
63  friend bool MatchXMLName(const XMLNode& node, const char *name);
64  friend bool MatchXMLName(const XMLNode& node, const std::string& name);
65  friend bool MatchXMLNamespace(const XMLNode& node1, const XMLNode& node2);
66  friend bool MatchXMLNamespace(const XMLNode& node, const char *uri);
67  friend bool MatchXMLNamespace(const XMLNode& node, const std::string& uri);
68  friend class XMLNodeContainer;
69 
70  protected:
71  xmlNodePtr node_;
73 
74  bool is_owner_;
78 
82  XMLNode(xmlNodePtr node)
83  : node_(node),
84  is_owner_(false),
85  is_temporary_(false) {}
86 
88  static void LogError(void * ctx, const char * msg, ...);
89 
91  bool Validate(xmlSchemaPtr schema, std::string &err_msg);
92 
93  public:
95 
97  XMLNode(void)
98  : node_(NULL),
99  is_owner_(false),
100  is_temporary_(false) {}
102 
105  XMLNode(const XMLNode& node)
106  : node_(node.node_),
107  is_owner_(false),
108  is_temporary_(false) {}
110 
111  XMLNode(const std::string& xml);
113 
114  XMLNode(const char *xml, int len = -1);
116  XMLNode(long ptr_addr);
118 
120  XMLNode(const NS& ns, const char *name);
122 
123  ~XMLNode(void);
125 
127  void New(XMLNode& node) const;
129 
142  void Exchange(XMLNode& node);
144 
149  void Move(XMLNode& node);
151 
158  void Swap(XMLNode& node);
160  operator bool(void) const {
161  return ((node_ != NULL) && (!is_temporary_));
162  }
164  bool operator!(void) const {
165  return ((node_ == NULL) || is_temporary_);
166  }
168  bool operator==(const XMLNode& node) {
169  return ((node_ == node.node_) && (node_ != NULL));
170  }
172  bool operator!=(const XMLNode& node) {
173  return ((node_ != node.node_) || (node_ == NULL));
174  }
176  bool Same(const XMLNode& node) {
177  return operator==(node);
178  }
180  bool operator==(bool val) {
181  return ((bool)(*this) == val);
182  }
184  bool operator!=(bool val) {
185  return ((bool)(*this) != val);
186  }
188  bool operator==(const std::string& str) {
189  return ((std::string)(*this) == str);
190  }
192  bool operator!=(const std::string& str) {
193  return ((std::string)(*this) != str);
194  }
196  bool operator==(const char *str) {
197  return ((std::string)(*this) == str);
198  }
200  bool operator!=(const char *str) {
201  return ((std::string)(*this) != str);
202  }
204 
205  XMLNode Child(int n = 0);
207 
215  XMLNode operator[](const char *name) const;
217 
218  XMLNode operator[](const std::string& name) const {
219  return operator[](name.c_str());
220  }
222 
230  XMLNode operator[](int n) const;
232 
233  void operator++(void);
235 
236  void operator--(void);
238  int Size(void) const;
240  XMLNode Get(const std::string& name) const {
241  return operator[](name.c_str());
242  }
244  std::string Name(void) const;
246  std::string Prefix(void) const;
248  std::string FullName(void) const {
249  return Prefix() + ":" + Name();
250  }
252  std::string Namespace(void) const;
254 
257  void Prefix(const std::string& prefix, int recursion = 0);
259  void StripNamespace(int recursion = 0);
261  void Name(const char *name);
263  void Name(const std::string& name) {
264  Name(name.c_str());
265  }
267  void GetXML(std::string& out_xml_str, bool user_friendly = false) const;
269 
272  void GetXML(std::string& out_xml_str, const std::string& encoding, bool user_friendly = false) const;
274  void GetDoc(std::string& out_xml_str, bool user_friendly = false) const;
276  operator std::string(void) const;
278  XMLNode& operator=(const char *content);
280  XMLNode& operator=(const std::string& content) {
281  return operator=(content.c_str());
282  }
284  void Set(const std::string& content) {
285  operator=(content.c_str());
286  }
288 
290  XMLNode& operator=(const XMLNode& node);
291  // Returns list of all attributes of node
292  // std::list<XMLNode> Attributes(void);
294  XMLNode Attribute(int n = 0);
296  XMLNode Attribute(const char *name);
298  XMLNode Attribute(const std::string& name) {
299  return Attribute(name.c_str());
300  }
302  XMLNode NewAttribute(const char *name);
304  XMLNode NewAttribute(const std::string& name) {
305  return NewAttribute(name.c_str());
306  }
308  int AttributesSize(void) const;
310 
319  void Namespaces(const NS& namespaces, bool keep = false, int recursion = -1);
321  NS Namespaces(void);
323  std::string NamespacePrefix(const char *urn);
325 
328  XMLNode NewChild(const char *name, int n = -1, bool global_order = false);
330  XMLNode NewChild(const std::string& name, int n = -1, bool global_order = false) {
331  return NewChild(name.c_str(), n, global_order);
332  }
334 
335  XMLNode NewChild(const char *name, const NS& namespaces, int n = -1, bool global_order = false);
337  XMLNode NewChild(const std::string& name, const NS& namespaces, int n = -1, bool global_order = false) {
338  return NewChild(name.c_str(), namespaces, n, global_order);
339  }
341 
343  XMLNode NewChild(const XMLNode& node, int n = -1, bool global_order = false);
345  void Replace(const XMLNode& node);
347 
349  void Destroy(void);
351 
356  XMLNodeList Path(const std::string& path);
358 
363  XMLNodeList XPathLookup(const std::string& xpathExpr, const NS& nsList);
365  XMLNode GetRoot(void);
367  XMLNode Parent(void);
369  bool SaveToFile(const std::string& file_name) const;
371  bool SaveToStream(std::ostream& out) const;
373  bool ReadFromFile(const std::string& file_name);
375  bool ReadFromStream(std::istream& in);
376  // Remove all eye-candy information leaving only informational parts
377  // void Purify(void);.
379  bool Validate(const std::string &schema_file, std::string &err_msg);
381  bool Validate(XMLNode schema_doc, std::string &err_msg);
382  };
383 
385  std::ostream& operator<<(std::ostream& out, const XMLNode& node);
387  std::istream& operator>>(std::istream& in, XMLNode& node);
388 
390 
392  private:
393  std::vector<XMLNode*> nodes_;
394  public:
396  XMLNodeContainer(void);
398 
402  ~XMLNodeContainer(void);
406 
407  void Add(const XMLNode&);
409  void Add(const std::list<XMLNode>&);
411 
413  void AddNew(const XMLNode&);
415  void AddNew(const std::list<XMLNode>&);
417  int Size(void) const;
419  XMLNode operator[](int);
421  std::list<XMLNode> Nodes(void);
422  };
423 
425  bool MatchXMLName(const XMLNode& node1, const XMLNode& node2);
426 
428  bool MatchXMLName(const XMLNode& node, const char *name);
429 
431  bool MatchXMLName(const XMLNode& node, const std::string& name);
432 
434  bool MatchXMLNamespace(const XMLNode& node1, const XMLNode& node2);
435 
437  bool MatchXMLNamespace(const XMLNode& node, const char *uri);
438 
440  bool MatchXMLNamespace(const XMLNode& node, const std::string& uri);
441 
444 } // namespace Arc
445 
446 #endif /* __ARC_XMLNODE_H__ */