glib 学习笔记4,解析xml文件

转载请注明出处,或联系 fanyuanmail@126.com
xml的用处越来越广泛了,解析xml得库也非常多,总的来说分为两种,一种是把xml当作一个“树”来进行解析,一种是基于事件类型的
 
glib就是使用事件类型解析xml。
有5种不同的事件类型
1)一个element的开始
2)一个element的结束
3)element得文本
4)一些stuff
5) 错误
There are five kinds of event which can happen:
  • The start of an element
  • The end of an element
  • Some text (inside an element)
  • Some other stuff (processing instructions, mainly, including comments and doctypes)
  • An error
下面是一个简单的xml

simple.xml :

<zoo>
<animal noise="roar">lion</animal>
<animal noise="sniffle">bunny</animal>
<animal noise="lol">cat</animal>
<keeper/>
</zoo>

被解析成以下的动作

  • Start of “zoo”.
  • Start of “animal”, with a “noise” attribute of “roar”.
  • The text “lion”.
  • End of “animal”.
  • Start of “animal”, with a “noise” attribute of “sniffle”.
  • The text “bunny”.
  • End of “animal”.
  • Start of “animal”, with a “noise” attribute of “lol”.
  • The text “cat”.
  • End of “animal”.
  • Start of “keeper”.
  • End of “keeper”.
  • End of “zoo”.
程序运行结果
I am a lion and I go roar. Can you do it?
I am a bunny and I go sniffle. Can you do it?
I am a cat and I go lol. Can you do it?

 
 

# include < stdio. h>

gchar * current_animal_noise = NULL ;

static void start( GMarkupParseContext * context,
        const gchar * element_name,
        const gchar * * attribute_names,
        const gchar * * attribute_values,
        gpointer user_data,
        GError * * error )
{
        const gchar * * name_cursor = attribute_names;
        const gchar * * value_cursor = attribute_values;

        while ( * name_cursor) {
                if ( strcmp ( * name_cursor, "noise" ) = = 0)
                current_animal_noise = g_strdup ( * value_cursor) ;
                name_cursor+ + ;
                value_cursor+ + ;
        }

}

static void end( GMarkupParseContext * context,
        const gchar * element_name,
        gpointer user_data,
        GError * * error )
{
        if ( current_animal_noise)
        {
                g_free ( current_animal_noise) ;
                current_animal_noise = NULL ;
        }
}

static void text( GMarkupParseContext * context,
        const gchar * text,
        gsize text_len,
        gpointer user_data,
        GError * * error )
{
        if ( current_animal_noise)
                printf ( "I am a %*s and I go %s. Can you do it?/n" ,
                    text_len, text, current_animal_noise) ;
        printf ( "test text/n" ) ;
}



GMarkupParser parser = {
        . start_element = start,
        . end_element = end,
        . text = text,
        . passthrough = NULL ,
        . error = NULL
} ;


int main( )
{
        char * buf;
        gsize length;
        GMarkupParseContext * context;
        g_file_get_contents( "test.xml" , & buf, & length, NULL ) ;
        g_printf( "%s/n" , buf) ;
        context = g_markup_parse_context_new( & parser, 0, NULL , NULL ) ;
        if ( g_markup_parse_context_parse( context, buf, length, NULL ) = = FALSE )
        {
                printf ( "Couldn't load xml/n" ) ;

                g_markup_parse_context_free(context);
        return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值