Files
microser/include/xmltools.h
2025-01-16 16:17:01 +08:00

146 lines
3.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#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
<pre>Example:
char *value = NULL;
rv= xml_get_elem("SYSCONF.xml","//systemconf/IPBCASTB/", &value);
//Example:
//<systemconf>
// <VERSION type="386">1.0</VERSION>
// <IPBCASTB > 172.20.255.255 </IPBCASTB>
//</systemconf>
//
//仿照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个谓词表达式。
</pre>
*/
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 */