diff options
Diffstat (limited to 'misc/samples/xml_sax.c')
| -rw-r--r-- | misc/samples/xml_sax.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/misc/samples/xml_sax.c b/misc/samples/xml_sax.c new file mode 100644 index 0000000..b586a21 --- /dev/null +++ b/misc/samples/xml_sax.c @@ -0,0 +1,109 @@ +/* + * Simple SAX example + */ + +#include <string.h> +#include <libxml/parser.h> +#include <libxml/tree.h> + +static int cb_total = 0; + +/* + * Callback implementations + */ +static void +cb_start_document(void *ctx ATTRIBUTE_UNUSED) +{ + cb_total++; + fprintf(stdout, "SAX.startDocument()\n"); +} + +static void +cb_end_document(void *ctx ATTRIBUTE_UNUSED) +{ + cb_total++; + fprintf(stdout, "SAX.endDocument()\n"); +} + +static void +cb_start_element(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts) +{ + int i; + + cb_total++; + fprintf(stdout, "SAX.startElement(%s", (char *) name); + if (atts != NULL) { + for (i = 0;(atts[i] != NULL);i++) { + fprintf(stdout, ", %s='", atts[i++]); + if (atts[i] != NULL) + fprintf(stdout, "%s'", atts[i]); + } + } + fprintf(stdout, ")\n"); +} + +static void +cb_end_element(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name) +{ + cb_total++; + fprintf(stdout, "SAX.endElement(%s)\n", (char *) name); +} + +static void +cb_characters(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len) +{ + char output[40]; + int i; + + cb_total++; + for (i = 0;(i<len) && (i < 30);i++) + output[i] = ch[i]; + output[i] = 0; + + fprintf(stdout, "SAX.characters(%s, %d)\n", output, len); +} + +static void +cb_comment(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value) +{ + cb_total++; + fprintf(stdout, "SAX.comment(%s)\n", value); +} + +/* + * Define callback struct + */ +xmlSAXHandler debugSAXHandlerStruct = { + NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, + cb_start_document, + cb_end_document, + cb_start_element, + cb_end_element, + NULL, + cb_characters, + NULL, NULL, + cb_comment, + NULL, NULL, NULL, NULL, NULL, NULL, + 1 +}; +xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct; + +int main(int argc, char **argv) { + int rc; + + if (argc != 2) + return 1; + + cb_total = 0; + rc = xmlSAXUserParseFile(debugSAXHandler, NULL, argv[1]); + if (rc) + fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", rc); + + fprintf(stdout, "\ncallback calls: %d\n", cb_total); + + xmlCleanupParser(); + xmlMemoryDump(); + + return(0); +} |
