Chinaunix首页 | 论坛 | 博客
  • 博客访问: 477008
  • 博文数量: 58
  • 博客积分: 6047
  • 博客等级: 准将
  • 技术积分: 838
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-06 21:05
文章分类

全部博文(58)

文章存档

2009年(24)

2008年(34)

我的朋友

分类: LINUX

2008-12-27 00:45:10

转载请注明出处,或联系
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:


lion
bunny
cat

被解析成以下的动作

  • 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;
}

阅读(2247) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-06-05 23:56:53

专注于 glib 的 qq 技术讨论群 : 1959878 欢迎朋友们加入

chinaunix网友2009-05-22 10:10:19

我有一个名为personal.xml 的xml文档保存在我的根目录下的一个名为samples的目录下,我用您的这个程序去实现它的解析,怎么去做?请您给予指点,我的邮箱是tjnuwanghu@163.com,很想和您交流xml的解析方面的问题。

chinaunix网友2009-05-22 10:02:19

您好!请问glib到底是什么啊,我也在看xml解析方面的资料最近,导师叫我利用xerces-c++解析器将一个xml文档解析成一个类似注册表那样的树,我折腾了好久没弄好,请高手指点,非常感激您!