diff options
author | Ross Burton <ross@linux.intel.com> | 2009-04-14 15:28:45 +0100 |
---|---|---|
committer | Ross Burton <ross@linux.intel.com> | 2009-04-14 17:44:14 +0100 |
commit | c1c500ac0d2691f33106cb8bc3989e9058a32616 (patch) | |
tree | b109caf7b4168206f1571bad904eb4404400b630 | |
parent | 6b7c9fb499f6ad80eeb7e74fea16c51366423505 (diff) | |
download | librest-c1c500ac0d2691f33106cb8bc3989e9058a32616.tar.gz |
Add a example to dump a XML file
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | examples/Makefile.am | 3 | ||||
-rw-r--r-- | examples/dump-xml.c | 112 |
3 files changed, 115 insertions, 1 deletions
@@ -25,5 +25,6 @@ docs/reference/rest/rest-decl*.txt examples/test-oauth examples/test-raw examples/test-xml +examples/dump-xml tests/oauth tests/proxy diff --git a/examples/Makefile.am b/examples/Makefile.am index 9fd4152..1955524 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1,4 +1,4 @@ -noinst_PROGRAMS = test-raw test-xml test-oauth +noinst_PROGRAMS = test-raw test-xml test-oauth dump-xml AM_CFLAGS = $(GLIB_CFLAGS) $(SOUP_CFLAGS) -I$(top_srcdir) AM_LDFLAGS = $(GLIB_LIBS) $(SOUP_LIBS) ../rest/librest.la @@ -6,3 +6,4 @@ AM_LDFLAGS = $(GLIB_LIBS) $(SOUP_LIBS) ../rest/librest.la test_raw_SOURCES = test-raw.c test_xml_SOURCES = test-xml.c test_oauth_SOURCES = test-oauth.c +dump_xml_SOURCES = dump-xml.c diff --git a/examples/dump-xml.c b/examples/dump-xml.c new file mode 100644 index 0000000..0983571 --- /dev/null +++ b/examples/dump-xml.c @@ -0,0 +1,112 @@ +/* + * librest - RESTful web services access + * Copyright (c) 2008, 2009, Intel Corporation. + * + * Authors: Rob Bradford <rob@linux.intel.com> + * Ross Burton <ross@linux.intel.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU Lesser General Public License, + * version 2.1, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include <rest/rest-xml-parser.h> + +/* These debugging functions *leak* */ +static gchar * +_generate_attrs_output (GHashTable *attrs) +{ + char *res; + char *res_old = NULL; + GList *keys, *values, *l, *ll; + + res = g_strdup ("{ "); + + keys = g_hash_table_get_keys (attrs); + values = g_hash_table_get_values (attrs); + + for (l = keys, ll = values; l; l = l->next, ll = ll->next) + { + res_old = res; + res = g_strconcat (res, l->data, ":", ll->data, " ", NULL); + g_free (res_old); + } + + g_list_free (keys); + g_list_free (values); + + res_old = res; + res = g_strconcat (res, "}", NULL); + g_free (res_old); + + return res; +} + +static void +_rest_xml_node_output (RestXmlNode *node, gint depth) +{ + RestXmlNode *child; + GList *values; + GList *l; + char *attrs_output = NULL; + + do { + attrs_output = _generate_attrs_output (node->attrs); + g_print ("%*s[%s, %s, %s]\n", + depth, + "", + node->name, + node->content ? node->content : "NULL", + attrs_output); + g_free (attrs_output); + values = g_hash_table_get_values (node->children); + for (l = values; l; l = l->next) + { + child = (RestXmlNode *)l->data; + g_print ("%*s%s - >\n", depth, "", child->name); + _rest_xml_node_output (child, depth + 4); + } + g_list_free (values); + } while ((node = node->next) != NULL); +} + +int +main (int argc, char **argv) +{ + RestXmlParser *parser; + RestXmlNode *node; + GError *error = NULL; + char *data = NULL; + gsize length; + + if (argc != 2) { + g_printerr ("$ dump-xml <FILENAME>\n"); + return 1; + } + + g_type_init (); + + if (!g_file_get_contents (argv[1], &data, &length, &error)) { + g_printerr ("%s\n", error->message); + g_error_free (error); + return 1; + } + + parser = rest_xml_parser_new (); + node = rest_xml_parser_parse_from_data (parser, data, length); + _rest_xml_node_output (node, 0); + rest_xml_node_unref (node); + g_object_unref (parser); + + return 0; +} |