acl  3.5.3.0
xml2.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include <list>
5 #include "string.hpp"
6 #include "xml.hpp"
7 
8 struct ACL_XML2;
9 struct ACL_XML2_NODE;
10 struct ACL_XML2_ATTR;
11 
12 namespace acl {
13 
14 class xml2;
15 class xml2_node;
16 
18 {
19 public:
20  /**
21  * @override
22  */
23  const char* get_name() const;
24 
25  /**
26  * @override
27  */
28  const char* get_value() const;
29 
30 protected:
31  friend class xml2_node;
32 
33  xml2_attr(xml_node* node, ACL_XML2_ATTR* attr);
34  ~xml2_attr(void) {}
35 
36 private:
37  ACL_XML2_ATTR* attr_;
38 };
39 
41 {
42 public:
43  /**
44  * @override
45  */
46  const char* tag_name(void) const;
47 
48  /**
49  * @override
50  */
51  const char* id(void) const;
52 
53  /**
54  * @override
55  */
56  const char* text(void) const;
57 
58  /**
59  * @override
60  */
61  const char* attr_value(const char* name) const;
62 
63  /**
64  * @override
65  */
66  const xml_attr* first_attr(void) const;
67 
68  /**
69  * @override
70  */
71  const xml_attr* next_attr(void) const;
72 
73  /**
74  * @override
75  */
76  xml_node& add_attr(const char* name, const char* value);
77 
78  /**
79  * @override
80  */
81  xml_node& set_text(const char* str, bool append = false);
82 
83  /**
84  * @override
85  */
86  xml_node& set_text(istream& in, size_t off = 0, size_t len = 0);
87 
88  /**
89  * @override
90  */
91  xml_node& add_child(xml_node* child, bool return_child = false);
92 
93  /**
94  * @override
95  */
96  int detach(void);
97 
98  /**
99  * @override
100  */
101  xml_node& set_parent(xml_node* node);
102 
103  /**
104  * @override
105  */
106  xml_node& get_parent(void) const;
107 
108  /**
109  * @override
110  */
111  xml_node* first_child(void);
112 
113  /**
114  * @override
115  */
116  xml_node* next_child(void);
117 
118  /**
119  * @override
120  */
121  int depth(void) const;
122 
123  /**
124  * @override
125  */
126  bool is_root(void) const;
127 
128  /**
129  * @override
130  */
131  int children_count(void) const;
132 
133 public:
134  void set_xml2_node(ACL_XML2_NODE* node);
135 
136  ACL_XML2_NODE* get_xml_node(void) const;
137 
138 protected:
139  friend class xml2;
140  friend class dbuf_guard;
141 
142  xml2_node(xml* xml_ptr, ACL_XML2_NODE* node);
143  ~xml2_node(void);
144 
145 private:
146  ACL_XML2_NODE *node_;
147  ACL_ITER* child_iter_;
148  ACL_ITER* attr_iter_;
149 
150  xml_node* parent_;
151  xml2_node* parent_internal_;
152 };
153 
154 class fstream;
155 
156 class ACL_CPP_API xml2 : public xml
157 {
158 public:
159  /**
160  * 构造函数,使 xml 对象树创建在指定内存映射文件上
161  * @param filepath {const char*} 内存映射文件名
162  * @param max_len {size_t} 内存映射文件的最大大小,即内存映射文件在自动
163  * 增长时不应超过此大小
164  * @param data {const char*} 非空时自动调用解析过程
165  * @param init_len {size_t} 内存映射文件创建时的初始大小
166  * @param dbuf_nblock {size_t} 内部所用 dbuf_guard 的初始化参数
167  * @param dbuf_capacity {size_t} 内部所用 dbuf_guard 的初始化参数
168  */
169  xml2(const char* filepath, size_t max_len, const char* data = NULL,
170  size_t init_len = 8192, size_t dbuf_nblock = 2,
171  size_t dbuf_capacity = 100);
172 
173  /**
174  * 构造函数,使 xml 对象树创建在指定内存映射文件上
175  * @param fp {fstream&} 内存映射文件句柄,该文件句柄应在本 xml 对象
176  * 释放前一直保持打开状态,即 fp 必须在 xml 对象释放后才可以关闭
177  * @param max_len {size_t} 内存映射文件的最大大小,即内存映射文件在自动
178  * 增长时不应超过此大小
179  * @param data {const char*} 非空时自动调用解析过程
180  * @param init_len {size_t} 内存映射文件创建时的初始大小
181  * @param dbuf_nblock {size_t} 内部所用 dbuf_guard 的初始化参数
182  * @param dbuf_capacity {size_t} 内部所用 dbuf_guard 的初始化参数
183  */
184  xml2(fstream& fp, size_t max_len, const char* data = NULL,
185  size_t init_len = 8192, size_t dbuf_nblock = 2,
186  size_t dbuf_capacity = 100);
187 
188  /**
189  * 构造函数,使 xml 对象树创建在指定内存映射文件上
190  * @param fd {ACL_FILE_HANDLE} 内存映射文件句柄,该文件句柄应在本 xml
191  * 对象释放前一直保持打开状态,即 fp 必须在 xml 对象释放后才可以关闭
192  * @param max_len {size_t} 内存映射文件的最大大小,即内存映射文件在自动
193  * 增长时不应超过此大小
194  * @param data {const char*} 非空时自动调用解析过程
195  * @param init_len {size_t} 内存映射文件创建时的初始大小
196  * @param dbuf_nblock {size_t} 内部所用 dbuf_guard 的初始化参数
197  * @param dbuf_capacity {size_t} 内部所用 dbuf_guard 的初始化参数
198  */
199 #if defined(_WIN32) || defined(_WIN64)
200  xml2(void* fd, size_t max_len, const char* data = NULL,
201  size_t init_len = 8192, size_t dbuf_nblock = 2,
202  size_t dbuf_capacity = 100);
203 #else
204  xml2(int fd, size_t max_len, const char* data = NULL,
205  size_t init_len = 8192, size_t dbuf_nblock = 2,
206  size_t dbuf_capacity = 100);
207 #endif
208 
209  ~xml2(void);
210 
211  /**
212  * @override
213  */
214  xml& ignore_slash(bool on);
215 
216  /**
217  * @override
218  */
219  xml& xml_decode(bool on);
220 
221  /**
222  * @override
223  */
224  xml& xml_encode(bool on);
225 
226  /**
227  * @override
228  */
229  xml& xml_multi_root(bool on);
230 
231  /**
232  * @override
233  */
234  const char* update(const char* data);
235 
236  /**
237  * @override
238  */
239  bool complete(const char* root_tag);
240 
241  /**
242  * @override
243  */
244  void reset(void);
245 
246  /**
247  * @override
248  */
249  const string& getText(void);
250 
251  /**
252  * @override
253  */
254  const std::vector<xml_node*>&
255  getElementsByTagName(const char* tag) const;
256 
257  /**
258  * @override
259  */
260  xml_node* getFirstElementByTag(const char* tag) const;
261 
262  /**
263  * @override
264  */
265  const std::vector<xml_node*>&
266  getElementsByTags(const char* tags) const;
267 
268  /**
269  * @override
270  */
271  xml_node* getFirstElementByTags(const char* tags) const;
272 
273  /**
274  * @override
275  */
276  const std::vector<xml_node*>&
277  getElementsByName(const char* value) const;
278 
279  /**
280  * @override
281  */
282  const std::vector<xml_node*>& getElementsByAttr(
283  const char* name, const char* value) const;
284 
285  /**
286  * @override
287  */
288  xml_node* getElementById(const char* id) const;
289 
290  /**
291  * @override
292  */
293  xml_node& create_node(const char* tag, const char* text = NULL);
294 
295  /**
296  * @override
297  */
298  xml_node& create_node(const char* tag, istream& in,
299  size_t off = 0, size_t len = 0);
300 
301  /**
302  * @override
303  */
304  xml_node& get_root(void);
305 
306  /**
307  * @override
308  */
309  xml_node* first_node(void);
310 
311  /**
312  * @override
313  */
314  xml_node* next_node(void);
315 
316  /**
317  * @override
318  */
319  void build_xml(string& out) const;
320 
321  /**
322  * @override
323  */
324  const char* to_string(size_t* len = NULL) const;
325 
326  /**
327  * @override
328  */
329  size_t space(void) const;
330 
331  /**
332  * @override
333  */
334  void space_clear(void);
335 
336  /**
337  * @override
338  */
339  size_t node_count(void) const;
340 
341  /**
342  * @override
343  */
344  size_t attr_count(void) const;
345 
346 public:
347  ACL_XML2* get_xml2(void) const
348  {
349  return xml_;
350  }
351 
352 private:
353  ACL_XML2* xml_;
354  ACL_ITER* iter_;
355  xml2_node* root_;
356 };
357 
358 } // namespace acl
HTTP_API void const char * name
Definition: lib_http.h:620
~xml2_attr(void)
Definition: xml2.hpp:34
#define ACL_CPP_API
ACL_XML2 * get_xml2(void) const
Definition: xml2.hpp:347