glib-2.0的GMarkup是一個簡單的xml解析器,他只支持簡單格式的xml,不支持除了utf-8以外的編碼格式,也不支持用戶自定義實體。但是對於簡單應用它就足夠了,比如我現在手頭上的一個工作就是它完成的。
GMarkup是事件驅動的xml解析器,對它的使用非常高效,在使用它的文件中加上<glib.h>頭文件。
爲了使用GMarkup解析xml文件,我們必須實現下面幾個函數,當然也可把它們設爲空,那麼xml解析到相應的元素時就什麼也不做了。
typedef struct { /* 假設有一行<node,att="value">this is text</node>*/ /* 解析器遇到元素開始符號調用這裏是<node,att="value">*/ void (*start_element) (GMarkupParseContext *context,/xml解析器上下文 const gchar *element_name,//元素名,這裏是node const gchar **attribute_names,//屬性數組,這裏是"att", const gchar **attribute_values,//屬性值數組,這裏是"value", gpointer user_data,//用戶自定義數據 GError **error);//保存返回的GError /* 遇到元素結束符號時調用,這裏是 </node> */ void (*end_element) (GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error); /* 遇到字符值時調用,這裏是 this is text*/ void (*text) (GMarkupParseContext *context, const gchar *text, //這裏是this is text gsize text_len,//長度 gpointer user_data, GError **error); /* 遇到註釋或者CDATA將調用 */ void (*passthrough) (GMarkupParseContext *context, const gchar *passthrough_text, gsize text_len, gpointer user_data, GError **error); /* 出錯時調用 */ void (*error) (GMarkupParseContext *context, GError *error, gpointer user_data); } GMarkupParser;
假設已經實現了前三個函數且分別爲start,end,text,那麼就可以通過如下方法創建GMarkupParser結構
GMarkupParser parser = {
.start_element = &start,
.end_element = &end,
.text = &text,
.passthrough = NULL,
.error = NULL
};,
做好這些工作後解析一個xml文件只需以下三步
1.讀取要解析的xml文件到一個buf中
2.創建xml解析器
GMarkupParseContext *context;
context = g_markup_parse_context_new(&parser, 0, &user_data, 0);
3.用解析器解析xml
g_markup_parse_context_parse(context, buf,buf_len, 0);
如果xml文件過大也可以多次調用g_markup_parse_context_parse函數進行解析。