GMarkupParser的簡單使用

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函數進行解析。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章