看我迷你xml函数库

在XML大行其道的今天,想不使用xml还真是比较困难的,不管是新锐java、c#等,就算是原始的c也逃不过。

不管是新系统还是老系统,总是要进行数据交换,而现阶段的最佳选项往往是xml。

很不幸的是c/c++的标准库里面并没有xml相关的实现,所以往往的要另行选择第三方库,当然也可以自己简单

的写一个,只满足自己需求的迷你库,或者连库都称不上,但是够用就好

用过的最出名的xml库,莫过于gnome的子项目libxml2了,使用纯C写的,功能强大,应用成熟,而且文档也很完

整,虽然是E文的,花半天时间还是整得通的;还有一大批人喜欢用tinyXml,这个我没有用过,所以不好评价,如果

我没有记错的话,tinyXml应该是用c++写的,本人有人习惯,如果使用第三方库,倾向于使用纯C库,一是比较清楚,

而且一般应用比较久比较成熟,最重要的是,我们那可怜的aix5.2只装了c的编译器。晕,说屁话已经成为我的一种

习惯 了,离题严重。

     综上所述,libxml2是最佳选择,但是libxml2有个相当严重的问题,不支持GBK以及GB2312,而且恰恰GB2312

是我们最常用的编码,对我们而言就是半残废了,虽然Google一下,还是有一些哥们自己给加上了这个编码的支持,

但是感觉就是不爽,如果哪一天libxml2发了新版,修正了哪个bug,是不是我们又要再改一次呢?在还没有正式支持之前

还是算了吧!

    屁话又说了一堆,无非是想推销我花了两天时间写的xml解析!

优点是用法简单,纯C写,文件小,跟那个libxml2比起来,咱这只是个张小泉,五毛钱一个的剪刀,不过相信不是所有的

人都需要使用切割器去剪头发的,所以,相信还是有点市场。不过缺点也是有的,毕竟没怎么优化,在解析xml的大文件时

效率相当低下,懒得花时间去整他了,毕竟这也只是个张小泉小剪刀!

介绍一下最简单的几个函数

tuobao_xml_query.h

 写个简单的demo

#include <stdlib.h>
#include 
<string.h>
#include 
<tuobao_xml_query.h>

int main (){
    xmlnode 
*parent,*node;
    
char *outXml;
    
    parent 
= NULL;
    outXml 
= NULL;
    
    
/*构造xml字符串*/
    tuobao_xmlnode_init(
&parent);
    tuobao_xmlnode_set(parent,
"books");
    
    
/*增加一个子节点*/
    node 
= tuobao_xmlnode_addchild(parent,"book");
    tuobao_xmlnode_addchild(node,
"name","深入浅出MFC");
    tuobao_xmlnode_addattribute(node,
"price","88.8");
    
    node 
= tuobao_xmlnode_addchild(parent,"book");
    tuobao_xmlnode_addchild(node,
"name","ASP.NET组件设计");
    tuobao_xmlnode_addattribute(node,
"price","108.8");
    
    
/*转成字符串*/
    
if(tuobao_xmlnode_to_str(parent,&outXml)){
        printf(
"toString失败!\n");
        
return 1;
    }

    printf(
"生成XML:\n%s\n",outXml);
    
    
/*释放掉结构体内存*/
    
if(parent != NULL){
        tuobao_xmlnode_free(parent);
        parent 
= NULL;
    }

    
    
/*解析XML*/
    
if(tuobao_xmlnode_parse(&parent,outXml)){
        printf(
"解析失败\n");
        
return 1;
    }

    
    
/*遍历一下节点*/
    node 
= tuobao_xmlnode_findpath(parent,"books/book");/* 以层级键名的方式查找*/
    
while(node != NULL){
        printf(
"<<%s>> 价格%s\n",
            tuobao_xmlnode_childvalue(node,
"name"),
            tuobao_xmlnode_atrr_value(node,
"price"));
            
        node 
= node->next;
    }

        
    
if(outXml) free(outXml);
    
/*释放掉结构体内存*/
    
if(parent != NULL){
        tuobao_xmlnode_free(parent);
        parent 
= NULL;
    }

    
    
return 0;
}

 

算了,需要的人直接下文件吧

 https://files.cnblogs.com/linbc/tuobao_xml_query.rar

 使用过程当中,有何不解,或者发现了bug,请留言

谢谢捧场!

posted @ 2009-05-31 14:54  冷侃  阅读(1069)  评论(0编辑  收藏  举报