⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlanalyzer.h

📁 基于Vxworks平台的几个代码(C)
💻 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 + -