static void expat_cb_start_element(void *user_data, const char *elem, const char **attrs) { struct exmpp_xml_data *edd; const char *real_elem, *ns; int ns_len; edd = (struct exmpp_xml_data *)user_data; /* With Expat, we must extract the namespace from the element's * name. */ real_elem = strchr(elem, NS_SEP); if (real_elem != NULL) { /* This element has a namespace. */ ns = elem; ns_len = real_elem - elem; real_elem++; } else { ns = NULL; ns_len = 0; real_elem = elem; } enter_element(&edd->ctx, ns, ns_len, real_elem, strlen(real_elem), edd->declared_nss, (void *)attrs); /* We can now reset the declared_nss list. We only reset the * index to avoid memory free/alloc. */ if (edd->declared_nss != NULL) edd->declared_nss->index = 0; }
static void libxml2_cb_start_element(void *user_data, const xmlChar *elem, const xmlChar *prefix, const xmlChar *ns, int declared_nss_count, const xmlChar **declared_nss, int attrs_count, int attrs_defaulted, const xmlChar **attrs) { struct exmpp_xml_data *edd; edd = (struct exmpp_xml_data *)user_data; edd->declared_nss_count = declared_nss_count; edd->declared_nss = declared_nss; edd->attrs_count = attrs_count; edd->attrs = attrs; enter_element(&edd->ctx, (char *)ns, -1, (char *)elem, -1, edd, edd); /* We can now reset the declared_nss and attrs lists. */ edd->declared_nss_count = 0; edd->declared_nss = NULL; edd->attrs_count = 0; edd->attrs = NULL; }