acl  3.5.3.0
xml1.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include <list>
5 #include "string.hpp"
6 #include "pipe_stream.hpp"
7 #include "xml.hpp"
8 
9 struct ACL_XML;
10 struct ACL_XML_NODE;
11 struct ACL_XML_ATTR;
12 
13 /**
14  * 对 ACL 库中 XML 解析库的封装,方便 C++ 用户使用,如果不太注重性能因素,
15  * 可以直接使用该类,如果在服务端执行且非常注重性能,建议直接使用 ACL 库的
16  * XML 解析器,因为该类也是调用了 ACL 库中的 XML 解析过程,并且有二次拷贝
17  * 过程,可能会稍微影响一些性能,但对于一般的应用这点影响是微不足道的
18  */
19 
20 namespace acl {
21 
22 class xml1;
23 class xml1_node;
24 
26 {
27 public:
28  /**
29  * @override
30  */
31  const char* get_name(void) const;
32 
33  /**
34  * @override
35  */
36  const char* get_value(void) const;
37 
38 protected:
39  friend class xml1_node;
40 
41  xml1_attr(xml_node* node, ACL_XML_ATTR* attr);
42  ~xml1_attr(void) {}
43 
44 private:
45  ACL_XML_ATTR* attr_;
46 };
47 
49 {
50 public:
51  /**
52  * @override
53  */
54  const char* tag_name(void) const;
55 
56  /**
57  * @override
58  */
59  const char* id(void) const;
60 
61  /**
62  * @override
63  */
64  const char* text(void) const;
65 
66  /**
67  * @override
68  */
69  const char* attr_value(const char* name) const;
70 
71  /**
72  * @override
73  */
74  const xml_attr* first_attr(void) const;
75 
76  /**
77  * @override
78  */
79  const xml_attr* next_attr(void) const;
80 
81  /**
82  * @override
83  */
84  xml_node& add_attr(const char* name, const char* value);
85 
86  /**
87  * @override
88  */
89  xml_node& set_text(const char* str, bool append = false);
90 
91  /**
92  * @override
93  */
94  xml_node& set_text(istream& in, size_t off = 0, size_t len = 0);
95 
96  /**
97  * @override
98  */
99  xml_node& add_child(xml_node* child, bool return_child = false);
100 
101  /**
102  * @override
103  */
104  int detach(void);
105 
106  /**
107  * @override
108  */
109  xml_node& set_parent(xml_node* node);
110 
111  /**
112  * @override
113  */
114  xml_node& get_parent(void) const;
115 
116  /**
117  * @override
118  */
119  xml_node* first_child(void);
120 
121  /**
122  * @override
123  */
124  xml_node* next_child(void);
125 
126  /**
127  * @override
128  */
129  int depth(void) const;
130 
131  /**
132  * @override
133  */
134  bool is_root(void) const;
135 
136  /**
137  * @override
138  */
139  int children_count(void) const;
140 
141 public:
142  /**
143  * 取出对应于 ACL 库中的 XML 节点对象
144  * @return {ACL_XML_NODE*} 返回节点对象,注:该节点用户不能单独释放
145  */
146  ACL_XML_NODE* get_xml_node(void) const;
147 
148 protected:
149  friend class xml1;
150  friend class dbuf_guard;
151 
152  /**
153  * xml 节点构造函数
154  * @param xml_ptr {xml*} xml 树对象,非空
155  * @param node {ACL_XML_NODE*} C 版中的 xml 节点指针
156  */
157  xml1_node(xml* xml_ptr, ACL_XML_NODE* node);
158 
159  /**
160  * 要求该对象必须是动态创建的
161  */
162  ~xml1_node(void);
163 
164 private:
165  ACL_XML_NODE *node_;
166  ACL_ITER* child_iter_;
167  ACL_ITER* attr_iter_;
168 
169  xml_node* parent_;
170  xml1_node* parent_internal_;
171 };
172 
173 class string;
174 
175 class ACL_CPP_API xml1 : public xml
176 {
177 public:
178  /**
179  * 构造函数
180  * @param data {const char*} xml 格式的字符串,可以是完整的
181  * xml 字符串,也可以是部分的 xml 字符串,也可以是空指针,
182  * 无论如何,用户依然可以用部分或完整的 xml 字符串调用 update
183  * 函数,在调用 update 过程中解析 xml;其实,当构造函数的
184  * 的 data 参数非空时,它也会调用 update
185  * @param dbuf_nblock {size_t} 内部所用 dbuf_guard 的初始化参数
186  * @param dbuf_capacity {size_t} 内部所用 dbuf_guard 的初始化参数
187  */
188  xml1(const char* data = NULL, size_t dbuf_nblock = 2,
189  size_t dbuf_capacity = 100);
190  ~xml1(void);
191 
192  /**
193  * @override
194  */
195  xml& ignore_slash(bool on);
196 
197  /**
198  * @override
199  */
200  xml& xml_decode(bool on);
201 
202  /**
203  * @override
204  */
205  xml& xml_encode(bool on);
206 
207  /**
208  * @override
209  */
210  xml& xml_multi_root(bool on);
211 
212  /**
213  * @override
214  */
215  const char* update(const char* data);
216 
217  /**
218  * @override
219  */
220  bool complete(const char* root_tag);
221 
222  /**
223  * @override
224  */
225  void reset(void);
226 
227  /**
228  * @override
229  */
230  const string& getText(void);
231 
232  /**
233  * @override
234  */
235  const std::vector<xml_node*>&
236  getElementsByTagName(const char* tag) const;
237 
238  /**
239  * @override
240  */
241  xml_node* getFirstElementByTag(const char* tag) const;
242 
243  /**
244  * @override
245  */
246  const std::vector<xml_node*>& getElementsByTags(const char* tags) const;
247 
248  /**
249  * @override
250  */
251  xml_node* getFirstElementByTags(const char* tags) const;
252 
253  /**
254  * @override
255  */
256  const std::vector<xml_node*>&
257  getElementsByName(const char* value) const;
258 
259  /**
260  * @override
261  */
262  const std::vector<xml_node*>& getElementsByAttr(
263  const char* name, const char* value) const;
264 
265  /**
266  * @override
267  */
268  xml_node* getElementById(const char* id) const;
269 
270  /**
271  * @override
272  */
273  xml_node& create_node(const char* tag, const char* text = NULL);
274 
275  /**
276  * @override
277  */
278  xml_node& create_node(const char* tag, istream& in,
279  size_t off = 0, size_t len = 0);
280 
281  /**
282  * @override
283  */
284  xml_node& get_root(void);
285 
286  /**
287  * @override
288  */
289  xml_node* first_node(void);
290 
291  /**
292  * @override
293  */
294  xml_node* next_node(void);
295 
296  /**
297  * @override
298  */
299  void build_xml(string& out) const;
300 
301  /**
302  * @override
303  */
304  const char* to_string(size_t* len = NULL) const;
305 
306  /**
307  * @override
308  */
309  size_t space(void) const;
310 
311  /**
312  * @override
313  */
314  void space_clear(void);
315 
316  /**
317  * @override
318  */
319  size_t node_count(void) const;
320 
321  /**
322  * @override
323  */
324  size_t attr_count(void) const;
325 
326 public:
327  /**
328  * 取得 acl 库中的 ACL_XML 对象
329  * @return {ACL_XML*} 该值不可能为空,注意用户可以修改该对象的值,
330  * 但不可以释放该对象
331  */
332  ACL_XML* get_xml(void) const
333  {
334  return xml_;
335  }
336 
337 private:
338  ACL_XML *xml_;
339  ACL_ITER* iter_;
340  xml1_node* root_;
341 };
342 
343 } // namespace acl
HTTP_API void const char * name
Definition: lib_http.h:620
~xml1_attr(void)
Definition: xml1.hpp:42
ACL_XML * get_xml(void) const
Definition: xml1.hpp:332
#define ACL_CPP_API