📄 xmlanalyzer.h
字号:
/*
* 库描述: XML分析器, XML信息采用多叉树结构存储(多叉树由链表表示), 存储模式有"内存"及"内存 & 磁盘文件"两种, 可通过预配置进行选择.
* 版本: 1.00
* 创建日期: 2005/07/15
* 始次定版日期: 2005/07/20
* 作者: 陈幸幸
*
* 修改日志:
* 2005/07/21> A) 突破了元素名及属性名的定长限制, 节约了存储空间。
* B) 添加了统计子结点个数的功能。
*/
#ifndef ___XML_ANALYZER___
#define ___XML_ANALYZER___
#include "../commonlib/pdefine.h"
/* 调试开关 */
#define XML_DEBUG (TRUE)
#define XML_SHOW_DEBUG_INFO (TRUE)
/* 选择存储模式"内存=1"或"内存 & 磁盘文件=2" */
#define XML_STORE_MODE (1)
/* 用来表示单一元素的最大字符数即包含于"<>"中的最大字符数 */
#define MAX_ELEMENT_EXPRESSION_CHAR (1024 * 2)
/* 元素名、属性名的最大字符数 */
#define MAX_NAME_CHAR (255)
/* 属性值的最大字符数 */
#define MAX_AT_VALUE_CHAR (255)
/* 最大嵌套级数 */
#define MAX_NEST_NUMBER (100)
/* 元素属性结构 */
typedef struct _ATTRIBUTE
{
char *Name; /* 属性名 */
char *Value; /* 属性值 */
}XML_ATTRIBUTE;
/* 元素属性结构(固定长度的名称与值) */
typedef struct _ATTRIBUTE_EX
{
char Name[MAX_NAME_CHAR + 1]; /* 属性名 */
char Value[MAX_AT_VALUE_CHAR + 1]; /* 属性值 */
}ATTRIBUTE_EX;
/* 元素结构 */
typedef struct _ELEMENT
{
char *Name; /* 元素名 */
char *Value; /* 元素值 */
UINT8 AttrNum; /* 元素属性个数 */
XML_ATTRIBUTE *pAttr; /* 元素属性列表 */
#if( XML_DEBUG == TRUE )
UINT32 Line; /* 对应于XML文件中的行号 */
#endif
}XML_ELEMENT;
/* 多叉树结点 */
typedef struct _TREE_NODE
{
XML_ELEMENT ele; /* XML元素 */
UINT32 sonNum; /* 子结点个数 */
struct _TREE_NODE *parent; /* 父级结点 */
struct _TREE_NODE *son; /* 子级结点 */
struct _TREE_NODE *next; /* 同级下一个结点 */
struct _TREE_NODE *prior; /* 同级上一个结点 */
}TREE_NODE;
/* 多叉树根(其实就是由N棵多叉树组成的森林) */
typedef struct _TREE_ROOT
{
UINT32 sonNum; /* 子结点个数 */
TREE_NODE *son; /* root的第一个子级结点 */
TREE_NODE *cur; /* 当前结点位置 */
}TREE_ROOT;
/* XML句柄 */
typedef UINT32 HXML;
/* 错误码 */
typedef enum
{
XML_ERR_OK = 0, /* 无错误 */
XML_ERR_FILE_NOT_EXIST = -1, /* XML文档不存在 */
XML_ERR_DECLARE_INVALID = -2, /* XML声明错误 */
XML_ERR_VERSION_UNSUPPORTED = -3, /* 不支持的XML版本 */
XML_ERR_ELEMENT_OVERFLOW = -4, /* 元素溢出 */
XML_ERR_ELEMENT_NOT_EXIST = -5, /* 元素不存在 */
XML_ERR_ATTRIBUTE_OVERFLOW = -6, /* 元素属性溢出 */
XML_ERR_ATTRIBUTE_NOT_EXIST = -7, /* 属性不存在 */
XML_ERR_NAME_TOO_LONG = -8, /* 名称太长 */
XML_ERR_NAME_INVALID = -9, /* 无效的名称 */
XML_ERR_EXPRESSION_INVALID = -10, /* 无效的表达式 */
XML_ERR_AT_VALUE_TOO_LONG = -11, /* 属性值太长 */
XML_ERR_ELE_VALUE_TOO_LONG = -12, /* 元素值太长 */
XML_ERR_FILE_IO = -13, /* 文件IO出错 */
XML_ERR_EXPRESSION_NULL = -14, /* 空表达式 */
XML_ERR_UNDEFINED_KEY = -15, /* 未定义的关键字 */
XML_ERR_UNSUPPORTED_KEY = -16, /* 不支持的关键字 */
XML_ERR_DATA_EMPTY = -17, /* 空数据 */
XML_ERR_NEST_OVERFLOW = -18, /* 嵌套级数溢出 */
XML_ERR_ABSENCE_BEGIN_TAG = -19, /* 缺少起始TAG */
XML_ERR_ABSENCE_END_TAG = -20, /* 缺少结束TAG */
XML_ERR_TAG_NOT_MATCH = -21, /* 标识没有匹配 */
XML_ERR_REJECT_REQUEST = -22, /* 请求被XML分析器拒绝 */
XML_ERR_BUILD_TREE_FAIL = -23, /* 创建XML树失败 */
XML_ERR_PARAM_INVALID = -24, /* 无效的参数 */
}XML_ERROR;
/* 对应于错误码的中文描述 */
#define XML_ERRTXT_OK "无错误"
#define XML_ERRTXT_FILE_NOT_EXIST "XML文档不存在"
#define XML_ERRTXT_DECLARE_INVALID "XML声明错误"
#define XML_ERRTXT_VERSION_UNSUPPORTED "不支持的XML版本"
#define XML_ERRTXT_ELEMENT_OVERFLOW "元素溢出"
#define XML_ERRTXT_ELEMENT_NOT_EXIST "元素不存在"
#define XML_ERRTXT_ATTRIBUTE_OVERFLOW "元素属性溢出"
#define XML_ERRTXT_ATTRIBUTE_NOT_EXIST "属性不存在"
#define XML_ERRTXT_NAME_TOO_LONG "名称太长"
#define XML_ERRTXT_NAME_INVALID "无效的名称"
#define XML_ERRTXT_EXPRESSION_INVALID "无效的表达式"
#define XML_ERRTXT_AT_VALUE_TOO_LONG "属性值太长"
#define XML_ERRTXT_ELE_VALUE_TOO_LONG "元素值太长"
#define XML_ERRTXT_FILE_IO "文件IO出错"
#define XML_ERRTXT_EXPRESSION_NULL "空表达式"
#define XML_ERRTXT_UNDEFINED_KEY "未定义的关键字"
#define XML_ERRTXT_UNSUPPORTED_KEY "不支持的关键字"
#define XML_ERRTXT_DATA_EMPTY "空数据"
#define XML_ERRTXT_NEST_OVERFLOW "嵌套级数溢出"
#define XML_ERRTXT_ABSENCE_BEGIN_TAG "缺少起始TAG"
#define XML_ERRTXT_ABSENCE_END_TAG "缺少结束TAG"
#define XML_ERRTXT_TAG_NOT_MATCH "标识没有匹配"
#define XML_ERRTXT_REJECT_REQUEST "请求被XML分析器拒绝"
#define XML_ERRTXT_BUILD_TREE_FAIL "创建XML树失败"
#define XML_ERRTXT_PARAM_INVALID "无效的参数"
/* 内部函数 */
/* 函数功能: 创建多叉树 */
TREE_ROOT* xmlTreeBuild( void );
/* 函数功能: 释放多叉树 */
void xmlTreeRelease( TREE_ROOT *root );
/* 函数功能: 定位结点(查找结点) */
TREE_NODE* xmlTreeReach( TREE_ROOT *root,
char *path
);
/* 函数功能: 在当前位置添加结点(兄弟或儿子) */
TREE_NODE* xmlTreeAdd( TREE_ROOT *root,
char *key,
BOOL bIsSon
);
/* 函数功能: 插入结点 */
TREE_NODE* xmlTreeAddByPath( TREE_ROOT *root,
char *path,
char *key,
BOOL bIsSon
);
/* 函数功能: 删除当前结点 */
void xmlTreeDelete( TREE_ROOT *root );
/* 函数功能: 删除指定结点 */
void xmlTreeDeleteByPath( TREE_ROOT *root,
char *path
);
/* 函数功能: 删除树枝 */
void xmlTreeCut( TREE_ROOT *root,
TREE_NODE *node
);
/* 函数功能: 定位于当前结点的右兄弟 */
TREE_NODE* xmlTreeMoveRight( TREE_ROOT *root );
/* 函数功能: 定位于当前结点的左兄弟 */
TREE_NODE* xmlTreeMoveLeft( TREE_ROOT *root );
/* 函数功能: 定位于当前结点的父亲 */
TREE_NODE* xmlTreeMoveParent( TREE_ROOT *root );
/* 函数功能: 定位于当前结点的儿子 */
TREE_NODE* xmlTreeMoveSon( TREE_ROOT *root );
/* 函数功能: 获取当前结点 */
TREE_NODE* xmlTreeGetCur( TREE_ROOT *root );
/* 操作函数定义 */
#ifdef __cplusplus
extern "C" {
#endif
/* 函数功能: 初始化XML分析器 */
BOOL xmlInitiate();
/* 函数功能: 关闭XML分析器 */
void xmlRelease();
/* 函数功能: XML语法预分析 */
XML_ERROR xmlPreAnaylse( const char *fn );
/* 函数功能: 载入XML文档 */
XML_ERROR xmlLoad( const char *fn, HXML *h );
/* 函数功能: 卸载XML文档 */
void xmlUnload( HXML h );
/* 函数功能: 读取指定路径下的子元素个数 */
UINT32 xmlGetSubEleNum( HXML h, char *path, char *name );
/* 函数功能: 读取当前元素的子元素的个数 */
UINT32 xmlGetCurSubEleNum( HXML h, char *name );
/* 函数功能: 测试是否存在指定元素 */
BOOL xmlIsExist( HXML h, char *path );
/* 函数功能: 读取指定元素 */
XML_ELEMENT* xmlGetElement( HXML h, char *path );
/* 函数功能: 读取同级的下一个元素 */
XML_ELEMENT* xmlGetNextElement( HXML h );
/* 函数功能: 读取同级的前一个元素 */
XML_ELEMENT* xmlGetPriorElement( HXML h );
/* 函数功能: 读取父级元素 */
XML_ELEMENT* xmlGetParentElement( HXML h );
/* 函数功能: 读取子级第一个元素 */
XML_ELEMENT* xmlGetSonElement( HXML h );
/* 函数功能: 读取当前元素 */
XML_ELEMENT* xmlGetCurrElement( HXML h );
/* 函数功能: 读取指定元素的指定属性 */
XML_ATTRIBUTE* xmlGetAttr( HXML h, char *path, char *attr_name );
/* 函数功能: 读取当前元素的指定属性 */
XML_ATTRIBUTE* xmlGetCurrAttr( HXML h, char *attr_name );
/* 函数功能: 定位于根 */
void xmlMoveToRoot( HXML h );
/* 函数功能: 将XML内部影像保存至外部文件 */
XML_ERROR xmlSave( HXML h );
/* 函数功能: 检查同一层上的元素顺序(以当前元素为起点) */
#define xmlCheckOrder xmlTreeCheckOrder
/* 函数功能: 获取相关错误的中文描述 */
char* xmlGetErrTxt( XML_ERROR errcode );
#ifdef __cplusplus
}
#endif
#endif /* ndef ___XML_ANALYZER___ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -