最近做嵌入式开拓,板子上面需要有理会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