using GLib; class Foo { public MarkupParser parser; string _name; public Foo(string name) { parser.start_element = start_element_func; parser.end_element = end_element_func; parser.text = text_func; parser.passthrough = passthrough_func; parser.error = error_func; _name = name; } private static void start_element_func (MarkupParseContext context, string element_name, string[] attribute_names, string[] attribute_values, void* user_data) throws MarkupError { var foo = (Foo) user_data; debug( "%s: start element %s", foo._name, element_name); } private static void end_element_func (MarkupParseContext context, string element_name, void* user_data) throws MarkupError { var foo = (Foo) user_data; debug( "%s: end element %s", foo._name, element_name); } private static void text_func (MarkupParseContext context, string text, size_t text_len, void* user_data) throws MarkupError { var foo = (Foo) user_data; debug( "%s: text %s", foo._name, text); } private static void passthrough_func (MarkupParseContext context, string passthrough_text, size_t text_len, void* user_data) throws MarkupError { var foo = (Foo) user_data; debug( "%s: passthrough %s", foo._name, passthrough_text); } private static void error_func (MarkupParseContext context, Error error, void* user_data) { var foo = (Foo) user_data; debug( "%s: error %s", foo._name, error.message); } } void main() { string xml_data = """ Tove Jani Reminder Don't forget me this weekend! """; var foo = new Foo("example markup"); var context = new MarkupParseContext (foo.parser, MarkupParseFlags.TREAT_CDATA_AS_TEXT, foo, null); try { context.parse (xml_data, xml_data.length); } catch (Error err) { print ("error %s", err.message); } }