Mini-XML在海思芯片上移植

1、在https://github.com/michaelrsweet/mxml/releases 下载mxml-2.11.tar.gz

2、创建一个文件夹mxml,用来编存放和编译mxml-2.11

3、解压后目录为mxml-2.11。
# cd mxml

# tar -xzvf mxml-2.11.tar.gz

3、编译mxml库

解压编译
./configure --host=arm-hisiv300-linux
修改生产了Makefile文件

OBJS       =   mmd.o mxmldoc.o testmxml.o zipc.o $(LIBOBJS)
修改为:
OBJS        =   mmd.o $(LIBOBJS)

在all:        $(TARGETS) 行后增加如下内容:
    $(AR) -r libmxml.a $(OBJS) 

make编译,生成libmxml.a文件
    
3、mini-xml使用;
(1)编译使用mini-xml库自带的testmxml.c
gcc -o testmxml testmxml.c -lmxml -lpthread
(2)编写自定义测试程序mymxml_test.c
gcc -o mymxml_test.c -lmxml -lpthread

编译完生成以下几个重要的文件

mxml.h 头文件
libmxml.a 静态链接库文件
libmxml.so 动态链接库的链接文件,链接到libmxml.so.1.4
libmxml.so.1 动态链接库的链接文件,链接到libmxml.so.1.4
libmxml.so.1.4 动态链接库本体

4、创建一个test文件夹,存放info.xml及编写的测试代码

# cd ..

# mkdir test

# cd test

info.xml信息如下:

  1. <?xml version= "1.0" ?>
  2. <node>
  3. <music>
  4. <state stat= "China">
  5. <url>http: //www.baidu.com</url>
  6. </state>
  7. </music>
  8. <search>
  9. <state stat= "China">
  10. <url>http: //www.baidu.com</url>
  11. </state>
  12. <state stat= "USA">
  13. <url>http: //www.google.com</url>
  14. </state>
  15. </search>
  16. </node>


test.c编写如下:

  1. #include<string.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include"mxml.h"
  5. int main(int argc,char **argv)
  6. {
  7. int i;
  8. FILE *fp;
  9. mxml_node_t *tree,*node,*search;
  10. mxml_node_t *state,*url;
  11. fp = fopen( "info.xml", "r");
  12. if(fp == NULL)
  13. {
  14. printf( "open the info.xml error!\n");
  15. return -1;
  16. }
  17. tree = mxmlLoadFile( NULL, fp,MXML_TEXT_CALLBACK);
  18. fclose(fp);
  19. if(tree == NULL)
  20. {
  21. printf( "Load file error!\n");
  22. return -1;
  23. }
  24. node = mxmlFindElement(tree, tree, "node", NULL, NULL,MXML_DESCEND);
  25. if(node == NULL)
  26. {
  27. printf( "can not find element node!\n");
  28. return -1;
  29. }
  30. search = mxmlFindElement(node, tree, "search", NULL, NULL,MXML_DESCEND);
  31. if(search == NULL)
  32. {
  33. printf( "can not find element search!\n");
  34. return -1;
  35. }
  36. for(state = mxmlFindElement(search, tree, "state", "stat", NULL,MXML_DESCEND);
  37. state != NULL;
  38. state = mxmlFindElement(state, tree, "state", "stat", NULL,MXML_DESCEND))
  39. {
  40. for(i= 0;i<state->value.element.num_attrs;i++)
  41. {
  42. if( memcmp(state->value.element.attrs[i].name, "stat", strlen( "stat")) == 0)
  43. {
  44. printf( "value:%s\n",state->value.element.attrs[i].value);
  45. url = mxmlFindElement(state, tree, "url", NULL, NULL,MXML_DESCEND);
  46. printf( "url:%s\n",mxmlGetText(url, NULL));
  47. }
  48. }
  49. }
  50. mxmlDelete(tree);
  51. printf( "success!\n");
  52. return 0;
  53. }

5、编译我们写的测试代码 (mxml-2.11目录与test目录在同一级目录下)

# arm-linux-gcc test.c -o test -static -I ../mxml-2.11 -L ../mxml-2.11 -lmxml -lpthread 

其中-lpthread是必选参数,因为libmxml库用到了pthread库在编译时,编译器会优先选择动态链接库编译,这样编译出的文件会小很多。但是同时也需要目标板上有动态链接库支持。如果想静态编译,在编译参数中加上-static

6、拷贝生成的test执行文件到arm开发板中

7、运行测试

# ./test

测试结果如下:

value:China
url:http://www.baidu.com
value:USA
url:http://www.google.com
success!

猜你喜欢

转载自blog.csdn.net/lbc2100/article/details/81002010