C写的 xml解析器,对xml进行读写查找...【博主没有验证的...】

来源:互联网 发布:php权限管理demo 编辑:程序博客网 时间:2024/05/02 06:10

源地址

http://news.newhua.com/news1/program_language/2008/825/08825154727F1FEG5I45HH1J4B3H0J2198EK3A1IC11341FAB337G5CG.html

 最近做嵌入式开发,板子上面需要有解析XML的功能,理所当然地我就去网上找开源的来用。结果找来的要不是C++的,要不就是超级复杂的。像libxml,我统计了下解析一个40几KB的XML文件,居然动态申请内存100多次,对于没有mmu功能的arm7,真是无福消受了。 

所以,我只能自己写一个来用了。 

我写的这个xml解析器,非常简单,核心代码只有600多行。当然,功能也相对弱些,只支持ansi编码的xml文件,只能解析,不能生成。 



整个解析器只用到了 若干条 EBNF文法 和 一个DFA状态机 (用来跳过注释的), 采用了递归下降的分析方法. 



整个解析过程没有动态申请内存,不会造成内存碎片(特别适应于没有mmu的设备), 当然,在开始解析之前,还是需要提供一片缓冲给解析器用的,最后生成的XML树,就放在这片缓冲里面. 



接口如下: 



/****************************************************** 
/* minixml.h 
/* 
/* author:@#$%^&* 
/* 
/* about: 
/* 该文件提供根据解析XML文件功能 
/* 
/* 
/* sample: 
/* 
/* 支持平台: windows , linux 2.4,2.6 uclinux 
/* [in] 表示是输入参数 
/* [out] 表示是输出参数 
/******************************************************/ 
#ifndef _MINIXML_H_08_17_ 
#define _MINIXML_H_08_17_ 
#define _CRT_SECURE_NO_DEPRECATE 

#if defined (__cplusplus) || defined (c_plusplus) 
extern "C" { 
#endif 

struct _MINI_XML_ATTRI; 
struct _MINI_XML_NODE; 

/* 记录一个属性信息 */ 
typedef struct _MINI_XML_ATTRI 

char* name; /* 属性名 */ 
char* value; /* 属性值 */ 
struct _MINI_XML_ATTRI* next; /* 指向下一个属性 */ 
} MINI_XML_ATTRI; 

/* 记录一个XML节点信息 */ 
typedef struct _MINI_XML_NODE 

char* name; /* 节点名 */ 
char* value; /* 节点值 */ 

MINI_XML_ATTRI* attri_list; /* 属性列表 */ 
struct _MINI_XML_NODE* parent; /* 父节点 */ 
struct _MINI_XML_NODE* child; /* 子节点, 若没有则为空 */ 
struct _MINI_XML_NODE* next; /* 同层下一节点 */ 
} MINI_XML_NODE; 



//////////////////////////////////////////////////// 
/// 说明 : 解析XML文件,返回XML的根节点 
/// 参数 : 
/// : xml xml文件路径 [in] 
/// : buffer 供解析用的缓冲 [in] 
/// : buffer_len 缓冲大小(单位:字节) [in] 
/// : error_reason 执行出错时保存错误原因 [in] 
/// : root XML的根节点 [out] 
/// 返回 : 成功 返回0 ,失败返回 -1 
/// 说明 : 
/// : 问 :供解析用的缓冲应该取多大比较合适呢? 
/// : 答 :供解析用的缓冲主要用来存放XML树, 所以 buffer_len >= (XML文件的大小) * 2 即可 
/// : 

int mini_parse_xml (char* xml, 
char* buffer, int buffer_len, 
char error_reason[128], 
MINI_XML_NODE** root); 


//////////////////////////////////////////////////// 
/// 说明 : 查找特定节点的子节点 
/// 参数 : 
/// : father 父结点 [in] 
/// : name 子孩子节点名 [in] 
/// : child 子节点 [out] 

int mini_find_child (MINI_XML_NODE* father, char* name, MINI_XML_NODE** child); 

//////////////////////////////////////////////////// 
/// 说明 : 查找特定节点的属性值 
/// 参数 : 
/// : node 节点 [in] 
/// : name 属性名 [in] 
/// : value 属性值 [out] 

int mini_find_attribute (MINI_XML_NODE* node, char* name, char** value); 


//////////////////////////////////////////////////// 
/// 说明 : 打印XML树,供调试用 
int mini_print_tree (MINI_XML_NODE* root , int layer); 

#if defined (__cplusplus) || defined (c_plusplus) 

#endif 
#endif 


下载地址 : http://www.simpoz.com/sellcode 

注:代码非免费提供,没有兴趣的朋友可不用点击.