xml

http://blog.chinaunix.net/uid-25885064-id-3180311.html




 起先使用libxml2解析xml文件,使用该库文件还需要libiconv库文件,编译出来的程序很大。由于嵌入式本身就受到资源的限制,影响到了其它程序的存储。最后,只能放弃使用xml2了。mxml比较精小,适合在嵌入式环境下解析xml文件,官方论坛也有中文教程。不多说,下面给出我写的一个实例,供大家参考。

1、创建一个文件夹,用来存放库文件及测试代码
# mkdir mxml

2、到官方网站http://www.minixml.org/software.php下载libmxml库文件,并将其解压到该目录下。我所使用的是2.7的版本,解压后目录为mxml-2.7。
# cd mxml
# tar -xzvf libxml2-sources-2.7.8.tar.gz

3、编译mxml库
# cd mxml-2.7
# ./configure
# make

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.         
  25.     node = mxmlFindElement(tree, tree, "node",NULL, NULL,MXML_DESCEND);
  26.     if(node == NULL)
  27.     {
  28.         printf("can not find element node!\n");
  29.         return -1;
  30.     }
  31.     
  32.     search = mxmlFindElement(node, tree,"search",NULL, NULL,MXML_DESCEND);
  33.     if(search == NULL)
  34.     {
  35.         printf("can not find element search!\n");
  36.         return -1;
  37.     }
  38.  
  39.     for(state = mxmlFindElement(search, tree, "state","stat", NULL,MXML_DESCEND);
  40.         state != NULL;
  41.         state = mxmlFindElement(state, tree, "state","stat", NULL,MXML_DESCEND))
  42.     {
  43.         for(i=0;i<state->value.element.num_attrs;i++)
  44.         {
  45.             if(memcmp(state->value.element.attrs[i].name,"stat",strlen("stat")) == 0)
  46.             {
  47.                 printf("value:%s\n",state->value.element.attrs[i].value);
  48.                 url = mxmlFindElement(state, tree, "url",NULL, NULL,MXML_DESCEND);
  49.                 printf("url:%s\n",mxmlGetText(url,NULL));
  50.             }
  51.         }
  52.     }

  53.     mxmlDelete(tree);
  54.     printf("success!\n");

  55.     return 0;
  56. }
5、编译我们写的测试代码
# gcc test.c -o test -static -Os -g -I ../mxml-2.7 -L ../mxml-2.7 -lmxml -lpthread 

6、运行测试
# ./test
测试结果如下:
value:China
url:http://www.baidu.com
value:USA
url:http://www.google.com
success!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值