#pragma once #include "acl_cpp/acl_cpp_define.hpp" #include #include #include "acl_cpp/stdlib/string.hpp" #include "acl_cpp/stdlib/pipe_stream.hpp" struct ACL_XML; struct ACL_XML_NODE; struct ACL_XML_ATTR; struct ACL_TOKEN; struct ACL_ITER; /** * ¶Ô ACL ¿âÖÐ XML ½âÎö¿âµÄ·â×°£¬·½±ã C++ Óû§Ê¹Óã¬Èç¹û²»Ì«×¢ÖØÐÔÄÜÒòËØ£¬ * ¿ÉÒÔÖ±½ÓʹÓøÃÀ࣬Èç¹ûÔÚ·þÎñ¶ËÖ´ÐÐÇҷdz£×¢ÖØÐÔÄÜ£¬½¨ÒéÖ±½ÓʹÓà ACL ¿âµÄ * XML ½âÎöÆ÷£¬ÒòΪ¸ÃÀàÒ²Êǵ÷ÓÃÁË ACL ¿âÖ§ÖÄ XML ½âÎö¹ý³Ì£¬²¢ÇÒÓ§Øþ´¦Ï½±´ * ¹ý³Ì£¬¿ÉÄÜ»áÉÔ΢ӰÏìÒ»§»ÐÔÄÜ£¬µ«¶ÔÓÚÒ»°ãµÄÓ¦ÓÃÕâµãÓ°ÏìÊÇ΢²»×ãµÀµÄ */ namespace acl { class xml; class xml_node; class ACL_CPP_API xml_attr { public: /** * »ñµÃÊôÐÔÃû * @return {const char*} ÊôÐÔÃû£¬ÓÀÔ¶²»»á·µ»Ø¿ÕÖ¸Õ룬·µ»ØÖµ * Ó§áÉÄÜΪ "\0" */ virtual const char* get_name(void) const; /** * »ñµÃÊôÐÔÖµ * @return {const char*} ÊôÐÔÖµ£¬ÓÀÔ¶²»»á·µ»Ø¿ÕÖ¸Õ룬·µ»ØÖµ * Ó§áÉÄÜΪ "\0" */ virtual const char* get_value(void) const; protected: xml_attr(void); virtual ~xml_attr(void); xml_node* node_; private: friend class xml_node; ACL_XML_ATTR* attr_; }; class ACL_CPP_API xml_node { public: /** * È¡µÃ±¾ XML ½ÚµãµÄ±êÇ©Ãû * @return {const char*} ·µ»Ø XML ½Úµã±êÇ©Ãû£¬Èç¹û·µ»Ø¿Õ£¬Ôò˵Ã÷ * ²»´æÔÚ±êÇ© xxxx£¬ÒÔ·ÀÍòÒ»£¬µ÷ÓÃÕßÐèҪŧØÏ·µ»ØÖµ */ virtual const char* tag_name(void) const; /** * Èç¹û¸Ã XML ½ÚµãµÄ ID ºÅÊôÐÔ²»´æÔÚ£¬Ôò·µ»Ø¿ÕÖ¸Õë * @return {const char*} µ± ID ÊôÐÔ´æÔÚʱ·µ»Ø¶ÔÓ¦µÄÖµ£¬·ñÔò·µ»Ø¿Õ */ virtual const char* id(void) const; /** * ·µ»Ø¸Ã XML ½ÚµãµÄÕýÎÄÄÚÈÝ * @return {const char*} ·µ»Ø¿Õ˵Ã÷ûÓÐÕýÎÄÄÚÈÝ */ virtual const char* text(void) const; /** * ·µ»Ø¸Ã XML ½ÚµãµÄij¸öÊôÐÔÖµ * @param name {const char*} ÊôÐÔÃû * @return {const char*} ÊôÐÔÖµ£¬Èç¹û·µ»Ø¿ÕÔò˵Ã÷¸ÃÊôÐÔ²»´æÔÚ */ virtual const char* attr_value(const char* name) const; /** * ·µ»Ø¸Ã XML ½ÚµãµÄij¸öÊôÐÔÖµµÄ±ã½Ý§Õ·¨ * @param name {const char*} ÊôÐÔÃû * @return {const char*} ÊôÐÔÖµ£¬Èç¹û·µ»Ø¿ÕÔò˵Ã÷¸ÃÊôÐÔ²»´æÔÚ */ const char* operator[](const char* name) const; /** * ±éÀú½ÚµãµÄËùÓÐÊôÐÔʱ£¬ÐèÒªµ÷Óô˺¯ÊýÀ´»ñµÃµÚÒ»¸öÊôÐÔ¶ÔÏó * @return {const xml_attr*} ·µ»ØµÚÒ»¸öÊôÐÔ¶ÔÏó£¬ÈôΪ¿Õ£¬Ôò±íʾ * ¸Ã½ÚµãûÓÐÊôÐÔ */ virtual const xml_attr* first_attr(void) const; /** * ±éÀú½ÚµãµÄËùÓÐÊôÐÔʱ£¬µ÷Óñ¾º¯Êý»ñµÃÏÂÒ»¸öÊôÐÔ¶ÔÏó * @return {const xml_attr*} ·µ»ØÏÂÒ»ÏÂÊôÐÔ¶ÔÏó£¬ÈôΪ¿Õ£¬Ôò±íʾ * ±éÀúÍê±Ï */ virtual const xml_attr* next_attr(void) const; /** * Ìí¼Ó XML ½ÚµãÊôÐÔ * @param name {const char*} ÊôÐÔÃû * @param value {const char*} ÊôÐÔÖµ * @return {xml_node&} */ virtual xml_node& add_attr(const char* name, const char* value); /** * Ìí¼Ó XML ½ÚµãÊôÐÔ * @param name {const char*} ÊôÐÔÃû * @param n {char} ÊôÐÔÖµ * @return {xml_node&} */ xml_node& add_attr(const char* name, char n); /** * Ìí¼Ó XML ½ÚµãÊôÐÔ * @param name {const char*} ÊôÐÔÃû * @param n {int} ÊôÐÔÖµ * @return {xml_node&} */ xml_node& add_attr(const char* name, int n); /** * Ìí¼Ó XML ½ÚµãÊôÐÔ * @param name {const char*} ÊôÐÔÃû * @param n {size_t} ÊôÐÔÖµ * @return {xml_node&} */ xml_node& add_attr(const char* name, size_t n); /** * Ìí¼Ó XML ½ÚµãÊôÐÔ * @param name {const char*} ÊôÐÔÃû * @param n {acl_int64} ÊôÐÔÖµ * @return {xml_node&} */ #if defined(_WIN32) || defined(_WIN64) xml_node& add_attr(const char* name, __int64 n); #else xml_node& add_attr(const char* name, long long int n); #endif /** * ÉèÖà xml ½ÚµãµÄÎı¾ÄÚÈÝ * @param str {const char*} ×Ö·û´®ÄÚÈÝ * @return {xml_node&} */ virtual xml_node& set_text(const char* str); /** * ÉèÖà xml ½ÚµãµÄÎı¾ÄÚÈÝ * @param number {long long int} 64 ¦ËÕûÊý * @return {xml_node&} */ #if defined(_WIN32) || defined(_WIN64) xml_node& set_text(__int64 number); #else xml_node& set_text(long long int number); #endif /** * ¸ø±¾ xml ½ÚµãÌí¼Ó xml_node ×Ó½Úµã¶ÔÏó * @param child {xml_node*} ×Ó½Úµã¶ÔÏó * @param return_child {bool} ÊÇ·ñÐèÒª±¾º¯Êý·µ»Øд´½¨µÄ×Ó½ÚµãµÄÒýÓà * @return {xml_node&} return_child Ϊ true ·µ»Ø×Ó½ÚµãµÄÒýÓ㬠* ·ñÔò·µ»Ø±¾ xml ½ÚµãÒýÓà */ virtual xml_node& add_child(xml_node* child, bool return_child = false); /** * ¸ø±¾ xml ½ÚµãÌí¼Ó xml_node ×Ó½Úµã¶ÔÏó * @param child {xml_node&} ×Ó½Úµã¶ÔÏó * @param return_child {bool} ÊÇ·ñÐèÒª±¾º¯Êý·µ»Øд´½¨µÄ×Ó½ÚµãµÄÒýÓà * @return {xml_node&} return_child Ϊ true ·µ»Ø×Ó½ÚµãµÄÒýÓ㬠* ·ñÔò·µ»Ø±¾ xml ½ÚµãÒýÓà */ xml_node& add_child(xml_node& child, bool return_child = false); /** * ¸ø±¾ xml ½ÚµãÌí¼Ó xml_node ×Ó½Úµã¶ÔÏó * @param tag {const char* tag} ×Ó½Úµã¶ÔÏóµÄ±êÇ©Ãû * @param return_child {bool} ÊÇ·ñÐèÒª±¾º¯Êý·µ»Øд´½¨µÄ×Ó½ÚµãµÄÒýÓà * @param str {const char*} Îı¾×Ö·û´® * @return {xml_node&} return_child Ϊ true ·µ»Ø×Ó½ÚµãµÄÒýÓ㬠* ·ñÔò·µ»Ø±¾ xml ½ÚµãÒýÓà */ xml_node& add_child(const char* tag, bool return_child = false, const char* str = NULL); /** * ¸ø±¾ xml ½ÚµãÌí¼Ó xml_node ×Ó½Úµã¶ÔÏó * @param tag {const char* tag} ×Ó½Úµã¶ÔÏóµÄ±êÇ©Ãû * @param number {long long int} 64 ¦ËÕûÊý * @param return_child {bool} ÊÇ·ñÐèÒª±¾º¯Êý·µ»Øд´½¨µÄ×Ó½ÚµãµÄÒýÓà * @return {xml_node&} return_child Ϊ true ·µ»Ø×Ó½ÚµãµÄÒýÓ㬠* ·ñÔò·µ»Ø±¾ xml ½ÚµãÒýÓà */ #if defined(_WIN32) || defined(_WIN64) xml_node& add_child(const char* tag, __int64 number, bool return_child = false); #else xml_node& add_child(const char* tag, long long int number, bool return_child = false); #endif /** * »ñµÃ±¾½ÚµãµÄ¸¸¼¶½Úµã¶ÔÏóµÄÒýÓà * @return {xml_node&} */ virtual xml_node& get_parent(void) const; /** * »ñµÃ±¾½ÚµãµÄµÚÒ»¸ö×ӽڵ㣬ÐèÒª±éÀú×Ó½Úµãʱ±ØÐëÊ×Ïȵ÷Óô˺¯Êý * @return {xml_node*} ·µ»Ø¿Õ±íʾûÓÐ×Ó½Úµã */ virtual xml_node* first_child(void); /** * »ñµÃ±¾½ÚµãµÄÏÂÒ»¸ö×Ó½Úµã * @return {xml_node*} ·µ»Ø¿Õ±íʾ±éÀú¹ý³Ì½áÊø */ virtual xml_node* next_child(void); /** * ·µ»Ø¸Ã XML ½ÚµãÔÚÕû¸ö XML Ê÷Ö§ÖÄÉî¶È * @return {int} */ virtual int depth(void) const; /** * ·µ»Ø¸Ã xml ½ÚµãµÄÏÂÒ»¼¶×Ó½ÚµãµÄ¸öÊý * @return {int} ÓÀÔ¶ >= 0 */ virtual int children_count(void) const; /** * µ±ÔÚ±éÀú¸Ã xml ½Úµãʱ£¬ÄÚ²¿»á¶¯Ì¬²úÉúÒ»§»ÁÙʱ xml_node ¶ÔÏ󣬵÷Óà * ´Ëº¯Êý¿ÉÒÔÇå¿ÕÕ⧻¶ÔÏó£¬Ò»µ©µ÷Óô˺¯Êý½øÐÐÁËÇå³ý£¬ÔòÓÉ * first_child/next_child ·µ»ØµÄ xml_node ½Úµã¶ÔÏ󽫲»ÔÙ¿ÉÓ㬷ñÔò»á * ²úÉúÄÚ´æ·Ç·¨·ÃÎÊ */ void clear(); /** * »ñµÃ xml ¶ÔÏóµÄÒýÓà * @return {xml&} */ xml& get_xml(void) const; public: /** * È¡³ö¶ÔÓ¦ÓÚ ACL ¿âÖ§ÖÄ XML ½Úµã¶ÔÏó * @return {ACL_XML_NODE*} ·µ»Ø½Úµã¶ÔÏó£¬×¢£º¸Ã½ÚµãÓû§²»Äܵ¥¶ÀÊÍ·Å */ ACL_XML_NODE* get_xml_node(void) const; protected: friend class xml; /** * xml ½Úµã¹¹Ô캯Êý * @param xml_ptr {xml*} xml Ê÷¶ÔÏó£¬·Ç¿Õ */ xml_node(xml* xml_ptr); /** * ÒªÇó¸Ã¶ÔÏó±ØÐëÊǶ¯Ì¬´´½¨µÄ */ virtual ~xml_node(void); /** * ÉèÖà xml ½Úµã * @param node {ACL_XML_NODE*} */ void set_xml_node(ACL_XML_NODE* node); protected: xml* xml_; xml_node* parent_; xml_node* parent_saved_; ACL_ITER* child_iter_; ACL_ITER* attr_iter_; std::vector nodes_tmp_; std::vector attrs_tmp_; private: ACL_XML_NODE *node_; }; class string; class ACL_CPP_API xml : public pipe_stream { public: /** * ¹¹Ô캯Êý * @param data {const char*} xml ¸ñʽµÄ×Ö·û´®£¬¿ÉÒÔÊÇÍêÕûµÄ * xml ×Ö·û´®£¬Ò²¿ÉÒÔÊDz¿·ÖµÄ xml ×Ö·û´®£¬Ò²¿ÉÒÔÊÇ¿ÕÖ¸Õ룬 * ÎÞÂÛÈ约²¬Óû§ÒÀÈ»¿ÉÒÔÓ¨°¿·Ö»òÍêÕûµÄ xml ×Ö·û´®µ÷Óà update * º¯Êý£¬ÔÚµ÷Óà update ¹ý³ÌÖ§ßâÎö xml£»Æäʵ£¬µ±¹¹Ô캯ÊýµÄ * µÄ data ²ÎÊý·Ç¿Õʱ£¬ËüÒ²»áµ÷Óà update * @param subclass {bool} ÊÇ·ñΪ×ÓÀàʵÀý£¬¼´Èç¹û¸ÃÀàʵÏÖÊÇÓÉ * ×ÓÀ๹Ô죬ÔòÐèÒªÌî true£¬·ñÔò¸Ã xml ½âÎöÆ÷Ö±½ÓÓɱ¾À๹Ôì */ xml(const char* data = NULL, bool subclass = false); virtual ~xml(void); /** * ¶ÔÓڷDZպϵıêÇ©£¬ÊÇ·ñÐèÒªºöÂÔ±ÕºÏ×Ö·û '/'£¬È±Ê¡Îª²»ºöÂÔ * @param on {bool} * @return {xml&} */ virtual xml& ignore_slash(bool on); /** * ÊÇ·ñ×Ô¶¯½øÐÐ xml ½âÂ룬ȱÉÙΪ²»½âÂë * @param on {bool} * @return {xml&} */ virtual xml& xml_decode(bool on); /** * ÒÔÁ÷ʽ·½Ê½Ñ­»·µ÷Óñ¾º¯ÊýÌí¼Ó XML Êý¾Ý£¬Ò²¿ÉÒÔÒ»´ÎÐÔÌí¼Ó * ÍêÕûµÄ XML Êý¾Ý£¬Èç¹ûÊÇÖظ´Ê¹Óøà XML ½âÎöÆ÷½âÎö¶à¸ö XML * ¶ÔÏó£¬ÔòÓ¦¸ÃÔÚ½âÎöÏÂÒ»¸ö XML ¶ÔÏóÇ°µ÷Óà reset() ·½·¨À´Çå * ³ýÉÏÒ»´¦ÅĽâÎö½á¹û * @param data {const char*} xml Êý¾Ý */ virtual void update(const char* data); /** * ÖØÖà XML ½âÎöÆ÷״̬£¬¸Ã XML ¶ÔÏó¿ÉÒÔÓÃÀ´¶Ô¶à¸ö XML Êý¾Ý * ½øЧßâÎö£¬ÔÚ·´¸´Ê¹Óñ¾ XML ½âÎöÆ÷Ç°£¬ÐèÒªµ÷Óñ¾º¯ÊýÖØÖà * ÄÚ²¿ XML ½âÎöÆ÷״̬£¬Çå³ýÉÏÒ»´¦ÅĽâÎö½á¹û */ virtual void reset(void); /** * ´Ó½âÎöµÄ XML ԭʼÊý¾ÝÖ§ßöÌáÈ¡Îı¾²¿·Ö * @return {const string&} ·µ»Ø½á¹û»º³åÇøµÄÒýÓ㬸ÃÒýÓÃÊÇÄÚ * ²¿±äÁ¿£¬Óû§²»ÐèÒªÊÍ·Å */ virtual const string& getText(void); /** * ´Ó XML ¶ÔÏóÖÐÈ¡µÃij¸ö±êÇ©ÃûµÄËùÓ§ßڵ㼯ºÏ * @param tag {const char*} ±êÇ©Ãû(²»Çø·Ö´ó§³§Õ) * @return {const std::vector&} ·µ»Ø½á¹û¼¯µÄ¶ÔÏóÒýÓ㬠* Èç¹û²éѯ½á¹ûΪ¿Õ£¬Ôò¸¨¹¯ºÏΪ¿Õ£¬¼´£ºempty() == true * ×¢£º·µ»ØµÄÊý×éÖ§ÖÄ xml_node ½ÚµãÊý¾Ý¿ÉÒÔÐ޸ģ¬µ«²»ÄÜɾ³ý¸Ã½Úµã£¬ * ÒòΪ¸Ã¿âÄÚ²¿ÓÐ×Ô¶¯É¾³ýµÄ»úÖÆ */ virtual const std::vector& getElementsByTagName(const char* tag) const; /** * ´Ó xml ¶ÔÏóÖ§ÝñµÃ¶ÔÓ¦±êÇ©ÃûµÄµÚÒ»¸ö xml ½Úµã¶ÔÏó * @param tag {const char*} ±êÇ©Ãû(²»Çø·Ö´ó§³§Õ) * @return {const xml_node*} ·µ»Ø¿Õ±íÃ÷¸Ã±êÇ©¶ÔÓ¦µÄ xml ½Úµã²»´æÔÚ */ virtual const xml_node* getFirstElementByTag(const char* tag) const; /** * ´Ó xml ¶ÔÏóÖ§ÝñµÃËùÓ§ÖÄÓë¸ø¶¨¶à¼¶±êÇ©ÃûÏàͬµÄ xml ½ÚµãµÄ¼¯ºÏ * @param tags {const char*} ¶à¼¶±êÇ©Ãû£¬ÓÉ '/' ·Ö¸ô¸÷¼¶±êÇ©Ãû£¬ÈçÕë¶Ô xml Êý¾Ý£º * text1 ... * text2 ... * text3 ... * ¿ÉÒÔͨ¹ý¶à¼¶±êÇ©Ãû£ºroot/first/second/third Ò»´ÎÐÔ²é³öËùÓ§ÙûºÏÌõ¼þµÄ½Úµã * @return {const std::vector&} ·ûºÏÌõ¼þµÄ xml ½Úµã¼¯ºÏ, * Èç¹û²éѯ½á¹ûΪ¿Õ£¬Ôò¸¨¹¯ºÏΪ¿Õ£¬¼´£ºempty() == true * ×¢£º·µ»ØµÄÊý×éÖ§ÖÄ xml_node ½ÚµãÊý¾Ý¿ÉÒÔÐ޸ģ¬µ«²»ÄÜɾ³ý¸Ã½Úµã£¬ * ÒòΪ¸Ã¿âÄÚ²¿ÓÐ×Ô¶¯É¾³ýµÄ»úÖÆ */ virtual const std::vector& getElementsByTags(const char* tags) const; /** * ´Ó xml ¶ÔÏóÖ§ÝñµÃÖ¸¶¨¶à¼¶±êÇ©ÃûµÄµÚÒ»¸ö xml ½Úµã * @param tags {const char*} ¶à¼¶±êÇ©Ãû£¬ÓÉ '/' ·Ö¸ô¸÷¼¶±êÇ©Ãû£¬ÈçÕë¶Ô xml Êý¾Ý£º * text1 ... * text2 ... * text3 ... * ¿ÉÒÔͨ¹ý¶à¼¶±êÇ©Ãû£ºroot/first/second/third Ò»´ÎÐÔ²é³öËùÓ§ÙûºÏÌõ¼þµÄ½Úµã * @return {const xml_node*} ·µ»Ø¿Õ±íʾ²»´æÔÚ */ virtual const xml_node* getFirstElementByTags(const char* tags) const; /** * ´Ó xml ¶ÔÏóÖ§ÝñµÃËùÓÐÓë¸ø¶¨ÊôÐÔÃû name µÄÊôÐÔÖµÏàͬµÄ xml ½Úµã¼¯ºÏ * @param value {const char*} ÊôÐÔÃûΪ name µÄÊôÐÔÖµ * @return {const std::vector&} ·µ»Ø½á¹û¼¯µÄ¶ÔÏóÒýÓ㬠* Èç¹û²éѯ½á¹ûΪ¿Õ£¬Ôò¸¨¹¯ºÏΪ¿Õ£¬¼´£ºempty() == true * ×¢£º·µ»ØµÄÊý×éÖ§ÖÄ xml_node ½ÚµãÊý¾Ý¿ÉÒÔÐ޸ģ¬µ«²»ÄÜɾ³ý¸Ã½Úµã£¬ * ÒòΪ¸Ã¿âÄÚ²¿ÓÐ×Ô¶¯É¾³ýµÄ»úÖÆ */ virtual const std::vector& getElementsByName(const char* value) const; /** * ´Ó xml ¶ÔÏóÖ§ÝñµÃËùÓ§Úø¶¨ÊôÐÔÃû¼°ÊôÐÔÖµµÄ xml ½ÚµãÔªËؼ¯ºÏ * @param name {const char*} ÊôÐÔÃû * @param value {const char*} ÊôÐÔÖµ * @return {const std::vector&} ·µ»Ø½á¹û¼¯µÄ¶ÔÏóÒýÓ㬠* Èç¹û²éѯ½á¹ûΪ¿Õ£¬Ôò¸¨¹¯ºÏΪ¿Õ£¬¼´£ºempty() == true */ virtual const std::vector& getElementsByAttr( const char* name, const char* value) const; /** * ´Ó xml ¶ÔÏóÖ§ÝñµÃÖ¸¶¨ id ÖµµÄ xml ½ÚµãÔªËØ * @param id {const char*} id Öµ * @return {const xml_node*} xml ½ÚµãÔªËØ, Èô·µ»Ø NULL Ôò±íʾûӧÙûºÏ * Ìõ¼þµÄ xml ½Úµã, ·µ»ØÖµ²»ÐèÒªÊÍ·Å */ virtual const xml_node* getElementById(const char* id) const; /** * ´´½¨Ò»¸ö xml_node ½Úµã¶ÔÏó * @param tag {const char*} ±êÇ©Ãû * @param text {const char*} Îı¾×Ö·û´® * @return {xml_node*} вúÉúµÄ xml_node ¶ÔÏó²»ÐèÒªÓû§ÊÖ¹¤ÊÍ·Å£¬ÒòΪÔÚ * xml ¶ÔÏó±»ÊÍ·ÅʱÕ⧻½Úµã»á×Ô¶¯±»ÊÍ·Å£¬µ±È»Óû§Ò²¿ÉÒÔÔÚ²»ÓÃʱµ÷Óà * reset À´ÊÍ·ÅÕ⧻ xml_node ½Úµã¶ÔÏó */ virtual xml_node& create_node(const char* tag, const char* text = NULL); /** * ´´½¨Ò»¸ö xml_node ½Úµã¶ÔÏó * @param tag {const char*} ±êÇ©Ãû * @param number {long long int} 64 ¦ËÕûÊý * @return {xml_node*} вúÉúµÄ xml_node ¶ÔÏó²»ÐèÒªÓû§ÊÖ¹¤ÊÍ·Å£¬ÒòΪÔÚ * xml ¶ÔÏó±»ÊÍ·ÅʱÕ⧻½Úµã»á×Ô¶¯±»ÊÍ·Å£¬µ±È»Óû§Ò²¿ÉÒÔÔÚ²»ÓÃʱµ÷Óà * reset À´ÊÍ·ÅÕ⧻ xml_node ½Úµã¶ÔÏó */ #if defined(_WIN32) || defined(_WIN64) xml_node& create_node(const char* tag, __int64 number); #else xml_node& create_node(const char* tag, long long int number); #endif /** * »ñµÃ¸ù½Úµã¶ÔÏ󣬵«ÐèҪעÒ⣬¸Ã½ÚµãΪÐé½Úµã£¬ÀïÃÖδæ·ÅȦÊÎÊý¾Ý£¬ * ËüÊÇËùÓÐ xml ½Úµã¶ÔÏóµÄ×²ã¸¸¶ÔÏó * @return {xml_node&} */ virtual xml_node& get_root(void); /** * ¿ªÊ¼±éÀú¸Ã xml ¶ÔÏó²¢»ñµÃµÚÒ»¸ö½Úµã * @return {xml_node*} ·µ»Ø¿Õ±íʾ¸Ã xml ¶ÔÏóΪ¿Õ½Úµã * ×¢£º·µ»ØµÄ½Úµã¶ÔÏóÓû§²»ÄÜÊÖ¹¤ÊÍ·Å£¬ÒòΪ¸Ã¶ÔÏó±» * ÄÚ²¿¿â×Ô¶¯ÊÍ·Å */ virtual xml_node* first_node(void); /** * ±éÀú¸Ã xml ¶ÔÏóµÄÏÂÒ»¸ö xml ½Úµã * @return {xml_node*} ·µ»Ø¿Õ±íʾ±éÀúÍê±Ï * ×¢£º·µ»ØµÄ½Úµã¶ÔÏóÓû§²»ÄÜÊÖ¹¤ÊÍ·Å£¬ÒòΪ¸Ã¶ÔÏó±» * ÄÚ²¿¿â×Ô¶¯ÊÍ·Å */ virtual xml_node* next_node(void); /** * ½« xml ¶ÔÏóÊ÷ת³É×Ö·û´® * @param out {string&} ´›¥×ª»»½á¹ûµÄ»º³åÇø */ virtual void build_xml(string& out) const; public: /** * È¡µÃ acl ¿âÖ§ÖÄ ACL_XML ¶ÔÏó * @return {ACL_XML*} ¸ÃÖµ²»¿ÉÄÜΪ¿Õ£¬×¢ÒâÓû§¿ÉÒÔÐ޸ĸöÔÏóµÄÖµ£¬ * µ«²»¿ÉÒÔÊͷŸöÔÏó */ ACL_XML* get_xml(void) const { return xml_; } public: // pipe_stream ÐüDÊýÖØÔØ virtual int push_pop(const char* in, size_t len, string* out, size_t max = 0); virtual int pop_end(string* out, size_t max = 0); virtual void clear(void); protected: xml_node* root_; std::vector elements_; string* buf_; //bool dummyRootAdded_; ACL_TOKEN* m_pTokenTree; std::list nodes_tmp_; ACL_ITER* iter_; private: ACL_XML *xml_; }; } // namespace acl