最近做嵌入式开发板子上面需要有解析XML的功能理所当然地我就去网上找开源的来用结果找来的要不是C++的要不就是超级复杂的像libxml我统计了下解析一个几KB的XML文件居然动态申请内存多次对于没有mmu功能的arm真是无福消受了
所以我只能自己写一个来用了
我写的这个xml解析器非常简单核心代码只有多行当然功能也相对弱些只支持ansi编码的xml文件只能解析不能生成
整个解析器只用到了 若干条 EBNF文法 和 一个DFA状态机 (用来跳过注释的) 采用了递归下降的分析方法
整个解析过程没有动态申请内存不会造成内存碎片(特别适应于没有mmu的设备) 当然在开始解析之前还是需要提供一片缓沖给解析器用的最后生成的XML树就放在这片缓沖里面
接口如下:
/******************************************************
/* minixmlh
/*
/* author:@#$%^&*
/*
/* about:
/* 该文件提供根据解析XML文件功能
/*
/*
/* sample:
/*
/* 支持平台: windows linux uclinux
/* [in] 表示是输入参数
/* [out] 表示是输出参数
/******************************************************/
#ifndef _MINIXML_H___
#define _MINIXML_H___
#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;
[] []