XML简单解析程序__C实现

103 篇文章 1 订阅
80 篇文章 0 订阅
最近一段时间总是用C和WEBSERVICE进行一些数据的交互,所以不得不用XML这些东西,用C写死分析程序总是不太好,稍做更改就是改程序,太麻烦。
 
所以,在用这些之前,自已写了点XML的解析小测试,感觉不是很难,拿出来和大家分享,如果您是高手,请不要见笑,如果您从中学到了点东西,那我非常高兴,不妥之处警请指正:
 
 

#include <libxml/xmlreader.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>

#define TEST


char * get_xml_value(xmlTextReaderPtr reader);
char * get_xml_key(xmlTextReaderPtr reader);
int parse_xml(const char *xml_buf, int xml_buf_size);

#ifdef TEST
int main()
{

 
    char *xml_buf = "<xmlTest xmlns=/"http://www.openuri.org//"><userName>1234567</userName><dstFolder>dddd</dstFolder><subject>test</subject></xmlTest>";
    parse_xml(xml_buf, strlen(xml_buf)); /*这里只是测试,不对返回值做判断*/
    return 0;
}
#endif

/*分解提交过来的XML串,当然也可以是一个文件,只要更改相关调用函数*/
int parse_xml(const char *xml_buf, int xml_buf_size)
{
    int ret = 0;
    int node_depth = 0;
    int node_type = 0;
    xmlTextReaderPtr xml_reader;

    xml_reader = xmlReaderForMemory(xml_buf, xml_buf_size, NULL, NULL, 0);
    if (NULL == xml_reader) {
        return -1;
    }

    while (1 == (ret = xmlTextReaderRead(xml_reader))) {

    
/*  这块是判断节点深度的,您可以对分解深度做一个限制
        node_depth = xmlTextReaderDepth(xml_reader);
        if (5 < node_depth) {
            ret = -2;
            break;
        }
*/

        /*判断当前节点的类型*/
        node_type = xmlTextReaderNodeType(xml_reader);
        switch(node_type) {
            case 1:
                get_xml_key(xml_reader);
                break;
            case 3:
                get_xml_value(xml_reader);
                break;

        }
    }

    xmlFreeTextReader(xml_reader);
    return ret;
}

/*取得当前节点的KEY值*/
char * get_xml_key(xmlTextReaderPtr reader)
{
    const xmlChar *key;
    key = xmlTextReaderConstName(reader);
    if (NULL == key) {
        return NULL;
    }
    printf("KEY : %s/n", key);
}
/*取得当前节点的VALUE值*/
char * get_xml_value(xmlTextReaderPtr reader)
{
    const xmlChar *value;

    value = xmlTextReaderConstValue(reader);
    if (NULL == value) {
        return NULL;
    }
    printf("VALUE : %s/n", value);
}

上述程序,结果一运行遍知。

前提是您必须安装LIBXML的库,可到http://xmlsoft.org/去下载,上面有详细的文档。

编译时要指定LIBXML的头文件路径和库的路径

gcc -I/xxx/libxml/include/libxml2 -L/xxx/libxml/lib -lxml2 -g -o target source.c

 

引用:http://blog.chinaunix.net/u/18768/showart_316081.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值