ANNA Suite  2020b
Multipurpose development suite for Telco applications
XPath.hpp
Go to the documentation of this file.
1 // ANNA - Anna is Not Nothingness Anymore //
2 // //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
4 // //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7 
8 
9 #ifndef anna_xml_XPath_hpp
10 #define anna_xml_XPath_hpp
11 
13 #include <anna/core/mt/Mutex.hpp>
15 
16 #include <anna/xml/Node.hpp>
17 #include <anna/xml/Parser.hpp>
18 
19 struct _xmlNode;
20 struct _xmlNodeSet;
21 struct _xmlXPathContext;
22 
23 namespace anna {
24 
25 namespace xml {
26 
33 class XPath : Parser {
34 public:
39  struct Mode {
40  enum _v {
41  Simple = 0x01,
42  Full = 0x02,
43  Namespace = 0x04
44  };
45  };
46 
51  XPath(const char* name);
52 
64  void apply(const Document& document, const char* expression, const int mode = Mode::Simple) noexcept(false);
65 
79  bool match(const Document& document, const char* expression, const int mode = Mode::Simple) noexcept(false);
80 
93  const Node* find(const Document& document, const char* expression, const int mode = Mode::Full, const Exception::Mode::_v emode = Exception::Mode::Throw)
94  noexcept(false);
95 
100  bool isEmpty() const { return a_root->a_children.size() == 0; }
101 
106  int size() const { return a_root->a_children.size(); }
107 
113 
119 
124  static const Node* node(Node::const_child_iterator& ii) { return xml::Node::node(ii); }
125 
126 private:
127  // Modo pasado al callback del apply
128  int a_mode;
129 
130  // Resultado retornado por el callback del match
131  bool a_result;
132 
133  typedef void(XPath::*Initialize)(_xmlXPathContext*, const Document&);
134  typedef void (XPath::*Callback)(const _xmlNodeSet*);
135 
137  friend struct ConfigSkeleton;
138 
139  struct ConfigSkeleton {
140  Initialize initialize;
141  Callback callback;
142 
143  ConfigSkeleton(Callback _callback) : initialize(NULL), callback(_callback) {;}
144  };
145 
146  XPath(const XPath&);
147 
148  void text(Node* node, _xmlNode* xmlNode) noexcept(false);
149 
150  void skeleton(const Document&, const char* expression, ConfigSkeleton&) noexcept(false);
151 
152  void initializeNamespaces(_xmlXPathContext*, const Document&) noexcept(false);
153  void forwardNamespaces(_xmlXPathContext*, _xmlNode*) noexcept(false);
154  void callbackApply(const _xmlNodeSet*);
155  void callbackMatch(const _xmlNodeSet*);
156 };
157 
158 }
159 }
160 
161 #endif
Definition: Exception.hpp:26
Definition: XPath.hpp:41
bool isEmpty() const
Definition: XPath.hpp:100
Definition: Document.hpp:49
_v
Definition: Exception.hpp:26
Definition: Node.hpp:56
_v
Definition: XPath.hpp:40
Node * a_root
Definition: Parser.hpp:117
Children::const_iterator const_child_iterator
Definition: Node.hpp:64
child_iterator child_begin()
Definition: Node.hpp:154
bool match(const Document &document, const char *expression, const int mode=Mode::Simple) noexcept(false)
Definition: Namespace.hpp:30
Definition: Parser.hpp:63
Node::const_child_iterator node_end() const
Definition: XPath.hpp:118
friend struct ConfigSkeleton
Definition: XPath.hpp:136
Definition: XPath.hpp:39
child_iterator child_end()
Definition: Node.hpp:199
Node::const_child_iterator node_begin() const
Definition: XPath.hpp:112
Definition: app.hpp:12
const Node * find(const Document &document, const char *expression, const int mode=Mode::Full, const Exception::Mode::_v emode=Exception::Mode::Throw) noexcept(false)
Definition: XPath.hpp:42
XPath(const char *name)
static const Node * node(Node::const_child_iterator &ii)
Definition: XPath.hpp:124
void apply(const Document &document, const char *expression, const int mode=Mode::Simple) noexcept(false)
int size() const
Definition: XPath.hpp:106
Definition: XPath.hpp:33
static Node * node(child_iterator &ii)
Definition: Node.hpp:399