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

来源:互联网 发布:java并发编程的好书 编辑:程序博客网 时间:2024/06/05 09:31

        前段时间在项目中用到了涉及到了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   1024000static 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!\n");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;}


0 0