30 #include "sixtp-parsers.h"
31 #include "sixtp-utils.h"
34 static xmlNsPtr global_namespace = NULL;
38 static gboolean dom_start_handler(
39 GSList* sibling_data, gpointer parent_data, gpointer global_data,
40 gpointer *data_for_children, gpointer *result,
const gchar *tag,
44 gchar** atptr = attrs;
46 if (parent_data == NULL)
48 thing = xmlNewNode(global_namespace, BAD_CAST tag);
54 thing = xmlNewChild((xmlNodePtr) parent_data,
60 *data_for_children = thing;
66 gchar *attr0 = g_strdup (atptr[0]);
67 gchar *attr1 = g_strdup (atptr[1]);
68 xmlSetProp(thing, checked_char_cast (attr0),
69 checked_char_cast (attr1));
79 dom_fail_handler(gpointer data_for_children,
80 GSList* data_from_children,
87 if (*result) xmlFreeNode(*result);
90 static gboolean dom_chars_handler(
91 GSList *sibling_data, gpointer parent_data, gpointer global_data,
92 gpointer *result,
const char *text,
int length)
96 gchar *newtext = g_strdup (text);
97 xmlNodeAddContentLen((xmlNodePtr)parent_data,
98 checked_char_cast (newtext), length);
105 sixtp_dom_parser_new(sixtp_end_handler ender,
106 sixtp_result_handler cleanup_result_by_default_func,
107 sixtp_result_handler cleanup_result_on_fail_func)
111 g_return_val_if_fail(ender, NULL);
114 sixtp_set_any(sixtp_new(), FALSE,
115 SIXTP_START_HANDLER_ID, dom_start_handler,
116 SIXTP_CHARACTERS_HANDLER_ID, dom_chars_handler,
117 SIXTP_END_HANDLER_ID, ender,
118 SIXTP_FAIL_HANDLER_ID, dom_fail_handler,
119 SIXTP_NO_MORE_HANDLERS)))
124 if (cleanup_result_by_default_func)
126 sixtp_set_cleanup_result(top_level, cleanup_result_by_default_func);
129 if (cleanup_result_by_default_func)
131 sixtp_set_result_fail(top_level, cleanup_result_on_fail_func);
134 if (!sixtp_add_sub_parser(top_level, SIXTP_MAGIC_CATCHER, top_level))
136 sixtp_destroy(top_level);