ddc
联网
平面设计 画册 VI欣赏 包装 CG-插画 搜索 个人网页 Alexa排名 CSS 建站资源 下载专区 JS特效 品牌服装 服装院校 专题欣赏 SEO 图标欣赏 专题
广州网站建设 上海网站设计 网站建设 上海网站建设 网站建设 广州网站设计 虚拟主机 域名注册 虚拟主机 广州网站建设 虚拟主机 域名注册 ACG动漫家园 ACG大玩家 上海网站建设 品牌设计 网站建设
网站建设
网站建设
品牌设计
中国设计秀
中国设计秀企业频道
时代网
中资源
当前位置:网络学院首页 >> 编程开发 >> .net >> C语言实现的XML解析器

C语言实现的XML解析器

来源:中国设计秀    作者:simpoz    点击:297     加入收藏    发表评论
0
顶一下
关键字:.net C语言

 最近做嵌入式开发,板子上面需要有解析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

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

2008-11-03 10:29:00    出处:simpoz.com
Google
热点文章/相关文章

音乐
嫁衣 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 没有人比我更爱你
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 明天过后 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 降临 下雨天 小酒窝 樱花草 恋爱新手 说唱脸谱 红色高跟鞋 寂寞才说爱 深深爱过你 爱上你是个错 即使知道要见面 不是因为寂寞才想你
城府 假如 花海 兰亭序 棉花糖 舍不得 最后一次 女人如烟 外滩十八号 我们的纪念 我们的无奈 心在跳情在烧 爱上你是我的错 爱情里没有谁对谁错
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明 | 网站公告 | 友情链接 | 留言 | 旧版入口