最近做嵌入式開(kāi)發(fā),板子上面需要有解析XML的功能,理所當(dāng)然地我就去網(wǎng)上找開(kāi)源的來(lái)用。結(jié)果找來(lái)的要不是C++的,要不就是超級(jí)復(fù)雜的。像libxml,我統(tǒng)計(jì)了下解析一個(gè)40幾KB的XML文件,居然動(dòng)態(tài)申請(qǐng)內(nèi)存100多次,對(duì)于沒(méi)有mmu功能的arm7,真是無(wú)福消受了。
所以,我只能自己寫(xiě)一個(gè)來(lái)用了。
我寫(xiě)的這個(gè)xml解析器,非常簡(jiǎn)單,核心代碼只有600多行。當(dāng)然,功能也相對(duì)弱些,只支持ansi編碼的xml文件,只能解析,不能生成。
整個(gè)解析器只用到了 若干條 EBNF文法 和 一個(gè)DFA狀態(tài)機(jī) (用來(lái)跳過(guò)注釋的), 采用了遞歸下降的分析方法.
整個(gè)解析過(guò)程沒(méi)有動(dòng)態(tài)申請(qǐng)內(nèi)存,不會(huì)造成內(nèi)存碎片(特別適應(yīng)于沒(méi)有mmu的設(shè)備), 當(dāng)然,在開(kāi)始解析之前,還是需要提供一片緩沖給解析器用的,最后生成的XML樹(shù),就放在這片緩沖里面.
接口如下:
/******************************************************
/* minixml.h
/*
/* author:@#$%^&*
/*
/* about:
/* 該文件提供根據(jù)解析XML文件功能
/*
/*
/* sample:
/*
/* 支持平臺(tái): windows , linux 2.4,2.6 uclinux
/* [in] 表示是輸入?yún)?shù)
/* [out] 表示是輸出參數(shù)
/******************************************************/
#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;
/* 記錄一個(gè)屬性信息 */
typedef struct _MINI_XML_ATTRI
{
char* name; /* 屬性名 */
char* value; /* 屬性值 */
struct _MINI_XML_ATTRI* next; /* 指向下一個(gè)屬性 */
} MINI_XML_ATTRI;
所以,我只能自己寫(xiě)一個(gè)來(lái)用了。
我寫(xiě)的這個(gè)xml解析器,非常簡(jiǎn)單,核心代碼只有600多行。當(dāng)然,功能也相對(duì)弱些,只支持ansi編碼的xml文件,只能解析,不能生成。
整個(gè)解析器只用到了 若干條 EBNF文法 和 一個(gè)DFA狀態(tài)機(jī) (用來(lái)跳過(guò)注釋的), 采用了遞歸下降的分析方法.
整個(gè)解析過(guò)程沒(méi)有動(dòng)態(tài)申請(qǐng)內(nèi)存,不會(huì)造成內(nèi)存碎片(特別適應(yīng)于沒(méi)有mmu的設(shè)備), 當(dāng)然,在開(kāi)始解析之前,還是需要提供一片緩沖給解析器用的,最后生成的XML樹(shù),就放在這片緩沖里面.
接口如下:
/******************************************************
/* minixml.h
/*
/* author:@#$%^&*
/*
/* about:
/* 該文件提供根據(jù)解析XML文件功能
/*
/*
/* sample:
/*
/* 支持平臺(tái): windows , linux 2.4,2.6 uclinux
/* [in] 表示是輸入?yún)?shù)
/* [out] 表示是輸出參數(shù)
/******************************************************/
#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;
/* 記錄一個(gè)屬性信息 */
typedef struct _MINI_XML_ATTRI
{
char* name; /* 屬性名 */
char* value; /* 屬性值 */
struct _MINI_XML_ATTRI* next; /* 指向下一個(gè)屬性 */
} MINI_XML_ATTRI;