前段时间在项目中用到了涉及到了xml文件的解析,环境是嵌入式linux,在此简单总结一下留个记录,也跟大家分享一下。
我在项目中用的是expat解析库,还有很多其它的库可以使用,比如libxml、minixml等,它们之间有些差别,下面是从网上粘来的说法。
目前的xml解析器一般有两种解析的形式.一种是DOM模型的,一种是SAX2模型的.DOM模型是讲xml文件中的结构解析成一棵树,然后再进行各种操作;而SAX2模型是类似与事件处理的方式从头到位解析xml文件.两种方式各有优劣,不过在嵌入式设备上用DOM模型的解析器似乎太耗内存,所以一般都用SAX2的解析器。
expat就是SAX2模型的解析器,下面简单说说安装和使用方法:
1.下载、解压expat库(网上资源很多,自己搜)
2.执行configure文件和make install、make,注意执行 configure时要把编译指令改为交叉编译指令(交叉编译指令视情况而定)如下:
./configure CC=arm-linux-gcc --host=arm-linux --prefix=$PWD/_install
3.使用方法:
expat库要包含的头文件是expat.h,如果是集成开发环境,如eclipse,需要包含动态库或者静态库(libexpat.a,libexpat.so)的路径,
expat要使用的函数有4个:
XML_ParserCreate()
XML_SetUserData()
XML_SetElementHandler()
XML_ParserFree()
粘一段代码
#include "readconfig.h"
#include "expat.h"
#define MAX_XML_CONFIG_FILE_SIZE 1024000
static Shm_Data_Cache *config_shm_data_cache = NULL;
static NAYU_INT32 g_channel_offset = 0;
static NAYU_INT32 g_device_offset = 0;
static NAYU_INT32 g_iopoint_offset = 0;
void startElement(void *userData, const char *name, const char **atts)
{/*这个函数中name就是属性名,*atts[奇数]是字段名,*atts[偶数]是字段值*/
}
void endElement(void *userData, const char *name)
{
/*这个函数中判断name的结尾并做出相应的处理*/
}
int Get_Total_Config(Shm_Data_Cache * shm)//自定义函数
{
config_shm_data_cache = shm;
NAYU_INT8 buf[MAX_XML_CONFIG_FILE_SIZE];
XML_Parser parser = XML_ParserCreate(NULL);
NAYU_INT32 depth = 0;
FILE* pf = fopen("/home/nayu/config/db.xml","r");
if(pf == NULL)
{
printf("Open xml file error!
");
return -1;
}
XML_SetUserData(parser, &depth);
XML_SetElementHandler(parser, startElement, endElement);
size_t len = 0;
do{
len = fread(buf, 1, sizeof(buf), pf);
XML_Parse(parser, buf, len, 1);
}while(len>0);
XML_ParserFree(parser);
fclose(pf);
return 0;
}