mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-14 00:40:55 +08:00
313 lines
5.5 KiB
C++
313 lines
5.5 KiB
C++
#pragma once
|
||
#include "acl_cpp/acl_cpp_define.hpp"
|
||
#include <vector>
|
||
#include <list>
|
||
#include "acl_cpp/stdlib/string.hpp"
|
||
#include "acl_cpp/stdlib/xml.hpp"
|
||
|
||
struct ACL_XML2;
|
||
struct ACL_XML2_NODE;
|
||
struct ACL_XML2_ATTR;
|
||
|
||
namespace acl {
|
||
|
||
class xml2;
|
||
class xml2_node;
|
||
|
||
class ACL_CPP_API xml2_attr : public xml_attr
|
||
{
|
||
public:
|
||
/**
|
||
* @override
|
||
* @return {const char*}
|
||
*/
|
||
const char* get_name() const;
|
||
|
||
/**
|
||
* @override
|
||
* @return {const char*}
|
||
*/
|
||
const char* get_value() const;
|
||
|
||
protected:
|
||
friend class xml2_node;
|
||
|
||
xml2_attr(xml_node* node, ACL_XML2_ATTR* attr);
|
||
~xml2_attr(void) {}
|
||
|
||
private:
|
||
ACL_XML2_ATTR* attr_;
|
||
};
|
||
|
||
class ACL_CPP_API xml2_node : public xml_node
|
||
{
|
||
public:
|
||
/**
|
||
* @override
|
||
*/
|
||
const char* tag_name(void) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const char* id(void) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const char* text(void) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const char* attr_value(const char* name) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const xml_attr* first_attr(void) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const xml_attr* next_attr(void) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node& add_attr(const char* name, const char* value);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node& set_text(const char* str);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node& add_child(xml_node* child, bool return_child = false);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
int detach(void);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node& get_parent(void) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node* first_child(void);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node* next_child(void);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
int depth(void) const;
|
||
|
||
/**
|
||
* @override
|
||
* @return {bool}
|
||
*/
|
||
bool is_root(void) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
int children_count(void) const;
|
||
|
||
public:
|
||
void set_xml2_node(ACL_XML2_NODE* node);
|
||
|
||
ACL_XML2_NODE* get_xml_node(void) const;
|
||
xml_node& set_parent(xml_node* node);
|
||
|
||
protected:
|
||
friend class xml2;
|
||
|
||
xml2_node(xml* xml_ptr, ACL_XML2_NODE* node);
|
||
~xml2_node(void);
|
||
|
||
private:
|
||
ACL_XML2_NODE *node_;
|
||
ACL_ITER* child_iter_;
|
||
ACL_ITER* attr_iter_;
|
||
|
||
xml_node* parent_;
|
||
xml2_node* parent_internal_;
|
||
};
|
||
|
||
class fstream;
|
||
|
||
class ACL_CPP_API xml2 : public xml
|
||
{
|
||
public:
|
||
/**
|
||
* <20><><EFBFBD>캯<EFBFBD><ECBAAF><EFBFBD><EFBFBD>ʹ xml <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>
|
||
* @param addr {char*} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* <20><><EFBFBD>洢<EFBFBD>ڸ<EFBFBD><DAB8>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* @param size {size_t} addr <20>ڴ<EFBFBD><DAB4>ռ<EFBFBD><D5BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||
* ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1>뱣֤<EBB1A3>ÿռ<C3BF><D5BC><EFBFBD>С<EFBFBD>㹻<EFBFBD><E3B9BB>
|
||
* @param data {const char*} <20>ǿ<EFBFBD>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
*/
|
||
xml2(char* addr, size_t size, const char* data = NULL);
|
||
|
||
/**
|
||
* <20><><EFBFBD>캯<EFBFBD><ECBAAF><EFBFBD><EFBFBD>ʹ xml <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||
* @param filepath {const char*} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||
* @param size {size_t} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Զ<EFBFBD>
|
||
* <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD>С
|
||
* @param data {const char*} <20>ǿ<EFBFBD>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* @param block {size_t} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC>С
|
||
* @param keep_open {bool} <20><EFBFBD><F2BFAAB5>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>Ƿ<EFBFBD>һֱ<D2BB><D6B1><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
|
||
* ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ч<EFBFBD><D0A7>
|
||
*/
|
||
xml2(const char* filepath, size_t size, const char* data = NULL,
|
||
size_t block = 8192, bool keep_open = true);
|
||
|
||
/**
|
||
* <20><><EFBFBD>캯<EFBFBD><ECBAAF><EFBFBD><EFBFBD>ʹ xml <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||
* @param fp {fstream&} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ڱ<EFBFBD> xml <20><><EFBFBD><EFBFBD>
|
||
* <20>ͷ<EFBFBD>ǰһֱ<D2BB><D6B1><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD> fp <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> xml <20><><EFBFBD><EFBFBD><EFBFBD>ͷź<CDB7><C5BA>ſ<EFBFBD><C5BF>Թر<D4B9>
|
||
* @param size {size_t} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Զ<EFBFBD>
|
||
* <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD>С
|
||
* @param data {const char*} <20>ǿ<EFBFBD>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* @param block {size_t} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC>С
|
||
*/
|
||
xml2(fstream& fp, size_t size, const char* data = NULL,
|
||
size_t block = 8192);
|
||
|
||
/**
|
||
* <20><><EFBFBD>캯<EFBFBD><ECBAAF><EFBFBD><EFBFBD>ʹ xml <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||
* @param fd {ACL_FILE_HANDLE} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ڱ<EFBFBD> xml
|
||
* <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ǰһֱ<D2BB><D6B1><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD> fp <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> xml <20><><EFBFBD><EFBFBD><EFBFBD>ͷź<CDB7><C5BA>ſ<EFBFBD><C5BF>Թر<D4B9>
|
||
* @param size {size_t} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>Զ<EFBFBD>
|
||
* <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD>С
|
||
* @param data {const char*} <20>ǿ<EFBFBD>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* @param block {size_t} <20>ڴ<EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC>С
|
||
*/
|
||
#if defined(_WIN32) || defined(_WIN64)
|
||
xml2(void* fd, size_t size, const char* data = NULL,
|
||
size_t block = 8192);
|
||
#else
|
||
xml2(int fd, size_t size, const char* data = NULL,
|
||
size_t block = 8192);
|
||
#endif
|
||
|
||
~xml2(void);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml& ignore_slash(bool on);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml& xml_decode(bool on);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
void update(const char* data);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
void reset(void);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const string& getText(void);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const std::vector<xml_node*>&
|
||
getElementsByTagName(const char* tag) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node* getFirstElementByTag(const char* tag) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const std::vector<xml_node*>&
|
||
getElementsByTags(const char* tags) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node* getFirstElementByTags(const char* tags) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const std::vector<xml_node*>&
|
||
getElementsByName(const char* value) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const std::vector<xml_node*>& getElementsByAttr(
|
||
const char* name, const char* value) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node* getElementById(const char* id) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node& create_node(const char* tag, const char* text = NULL);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node& get_root(void);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node* first_node(void);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
xml_node* next_node(void);
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
void build_xml(string& out) const;
|
||
|
||
/**
|
||
* @override
|
||
*/
|
||
const char* to_string(size_t* len = NULL) const;
|
||
|
||
public:
|
||
ACL_XML2* get_xml2(void) const
|
||
{
|
||
return xml_;
|
||
}
|
||
|
||
private:
|
||
ACL_XML2* xml_;
|
||
ACL_ITER* iter_;
|
||
xml2_node* root_;
|
||
};
|
||
|
||
} // namespace acl
|