嵌入式linux对xml文件的操作(expat篇)

2019-07-13 03:05发布

        前段时间在项目中用到了涉及到了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; }