/** * @file xmltools.h * @brief 数据库XML文件解析接口 * * @version $Revision: 1.1 $ * @date $Date: 2018/11/24 06:54:50 $ * @author $Author: lizhongming $ * @state $State: Exp $ * */ #ifndef _XMLTOOLS_H #define _XMLTOOLS_H #include #include #include #include "utf.h" typedef int (*db_parser_handler)(char* buf,void* object,void* rdb); typedef int (dbparser_fn_t)(char* buf,void* object,void* rdb); /** Skip unused part of xml * set skip tag and the levels, * when the end tag handler encounters the same depth , the * skipped element has ended and the flag be cleared! * assuming {root}=1 ,skip flag and skip depth */ typedef struct xml_parse_skip_t xml_parse_skip_t; struct xml_parse_skip_t{ int skip_flag; /**< is skip */ int skip_depth; /**< which level of the depth */ int global_depth;/**< {root}=1 */ }; #define XML_TOOLS_ATTR_AND (1) //attr is and relation #define XML_TOOLS_ATTR_OR (2) //attr is or-relation #define XMLTOOLS_MAX_PATH_LEN (10) //最大支持路径层数 #define XMLTOOLS_MAX_VALUE_LEN (64) //最大值字符表达长度 #define XMLTOOLS_MAX_TAG_LEN (32) //标签长度 #define XMLTOOLS_MAX_NAME XMLTOOLS_MAX_TAG_LEN #define XMLTOOLS_MAX_ATTR_LEN (3) //max 3 attrs typedef char** elem_text ; typedef struct path_session_t path_session_t; typedef struct attr_pair attr_pair; struct attr_pair{ char name[XMLTOOLS_MAX_NAME]; char value[XMLTOOLS_MAX_TAG_LEN]; }; typedef enum type_identifier_e type_identifier_e; enum type_identifier_e{ axis_child, axis_attribute, predicate }; /** contains one seesion of xpath*/ struct path_session_t { type_identifier_e type_identifier; char tag[XMLTOOLS_MAX_TAG_LEN]; /**< */ attr_pair attrs[XMLTOOLS_MAX_ATTR_LEN]; /**< 每个属性之间是与的关系 */ //attr_pair * current;//current position of attr_pair ,used internal int level; /**< desired level, root elem is 1*/ }; #ifdef __cplusplus extern "C" { #endif /** * @brief 通过一次遍历XML文件获取某一类型数据的全部属性值 * @param filename XML文件名 * @param path element路径 * @param item element类型 * @param output_data 该类element的数据缓冲区 * @return 返回 APR_SUCCESS - 成功 * APR_NOTFOUND - element不存在 * APR_EBADF - 文件错误 */ APR_DECLARE(int) xml_db_attach(const char* filename,const char* path, const char* item, db_parser_handler pfn,void* output_data); /** * @brief 获取XML文件里的单个element属性值 * @param filename XML文件名 * @param path element全路径 * @param value 获取的element的属性值 * @return 返回 APR_SUCCESS - 成功 * APR_NOTFOUND - element不存在 * APR_EBADF - 文件错误 * @note
Example:
 char *value = NULL;
rv= xml_get_elem("SYSCONF.xml","//systemconf/IPBCASTB/", &value);
//Example:
//
//     1.0
//      172.20.255.255 
//
//
//仿照XPATH语法
//axis-identifier::node-test[predicate1][predicate2]..

//rv=xml_get_elem("SYSCONF.xml","//systemconf/IPBCASTB/", &value);

value=" 172.20.255.255 "

//rv=xml_get_elem("SYSCONF.xml","//systemconf/VERSION/@type/", &value); 

value="386"
//rv=xml_get_elem("SYSCONF.xml","//systemconf/VERSION[attribute::type="386"]/", &value); 

value="1.0"
//注意目前谓词只支持=号,只支持attribute轴,只支持1个谓词表达式。
*/ APR_DECLARE(int) xml_get_elem(const char* filename,const char* path, char **value); /** * @brief dbparser_fn_retrieve * @param fn_name 要取得的已注册函数名 */ APR_DECLARE(dbparser_fn_t*) dbparser_fn_retrieve(const char *fn_name); /** * @brief dbparser_fn_register * @param fn_name 要注册函数名 * @param pfn 处理函数句柄 */ APR_DECLARE(void) dbparser_fn_register(const char *fn_name,dbparser_fn_t *pfn, apr_pool_t *pool); APR_DECLARE(int) xml_get_elem_free_memory(void *point); #ifdef __cplusplus } #endif #endif /* _XMLTOOLS_H */