[gnome-builder/wip/greeter] xml: add simplified xml reader interface
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/greeter] xml: add simplified xml reader interface
- Date: Sun, 10 May 2015 08:06:47 +0000 (UTC)
commit e2165b3cb24cac76060a2303687681030c4f7890
Author: Christian Hergert <christian hergert me>
Date: Sun May 10 00:49:36 2015 -0700
xml: add simplified xml reader interface
Just an old helper I tend to copy around. If we have something better
that doesn't require managing xmlChar copies and libxml2 callbacks
everywhere, then we can move to that.
But for now, this will do.
configure.ac | 4 +
contrib/Makefile.am | 2 +-
contrib/xml/Makefile.am | 11 +
contrib/xml/xml-reader.c | 597 ++++++++++++++++++++++++++++++++++++++++++++++
contrib/xml/xml-reader.h | 100 ++++++++
5 files changed, 713 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index d255e86..13ab360 100644
--- a/configure.ac
+++ b/configure.ac
@@ -147,6 +147,7 @@ m4_define([ggit_required_version], [0.22.6])
m4_define([gjs_required_version], [1.42.0])
m4_define([pygobject_required_version], [3.0.0])
m4_define([devhelp_required_version], [3.16.0])
+m4_define([libxml_required_version], [2.9.0])
PKG_CHECK_MODULES(BUILDER, [gtk+-3.0 >= gtk_required_version
gio-2.0 >= glib_required_version
@@ -168,6 +169,8 @@ PKG_CHECK_MODULES(GEDIT, [glib-2.0 >= glib_required_version
gtk+-3.0 >= gtk_required_version])
PKG_CHECK_MODULES(NAUTILUS, [glib-2.0 >= glib_required_version
gtk+-3.0 >= gtk_required_version])
+PKG_CHECK_MODULES(XML, [gio-2.0 >= glib_required_version
+ libxml-2.0 >= libxml_required_version])
dnl ***********************************************************************
@@ -328,6 +331,7 @@ AC_CONFIG_FILES([
contrib/gedit/Makefile
contrib/nautilus/Makefile
contrib/libeditorconfig/Makefile
+ contrib/xml/Makefile
libide/ide-debug.h
libide/Makefile
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 7c67970..f0a3ce3 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -1,3 +1,3 @@
-SUBDIRS = search gedit nautilus libeditorconfig egg
+SUBDIRS = search gedit nautilus libeditorconfig egg xml
-include $(top_srcdir)/git.mk
diff --git a/contrib/xml/Makefile.am b/contrib/xml/Makefile.am
new file mode 100644
index 0000000..96d8568
--- /dev/null
+++ b/contrib/xml/Makefile.am
@@ -0,0 +1,11 @@
+noinst_LTLIBRARIES = libxml.la
+
+libxml_la_SOURCES = \
+ xml-reader.c \
+ xml-reader.h \
+ $(NULL)
+
+libxml_la_CFLAGS = $(XML_CFLAGS)
+libxml_la_LIBADD = $(XML_LIBS)
+
+-include $(top_srcdir)/git.mk
diff --git a/contrib/xml/xml-reader.c b/contrib/xml/xml-reader.c
new file mode 100644
index 0000000..2e5737e
--- /dev/null
+++ b/contrib/xml/xml-reader.c
@@ -0,0 +1,597 @@
+/* xml-reader.c
+ *
+ * Copyright (C) 2009 Christian Hergert <chris dronelabs com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that 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.
+ *
+ * Author:
+ * Christian Hergert <chris dronelabs com>
+ */
+
+#include <glib/gi18n.h>
+#include <string.h>
+#include <libxml/xmlreader.h>
+
+#include "xml-reader.h"
+
+#define XML_TO_CHAR(s) ((char *) (s))
+#define CHAR_TO_XML(s) ((unsigned char *) (s))
+#define RETURN_STRDUP_AND_XMLFREE(stmt) \
+ G_STMT_START { \
+ guchar *x; \
+ gchar *y; \
+ x = stmt; \
+ y = g_strdup((char *)x); \
+ xmlFree(x); \
+ return y; \
+ } G_STMT_END
+
+struct _XmlReader
+{
+ GObject parent_instance;
+ xmlTextReaderPtr xml;
+ GInputStream *stream;
+ gchar *cur_name;
+ gchar *encoding;
+ gchar *uri;
+};
+
+enum {
+ PROP_0,
+ PROP_ENCODING,
+ PROP_URI,
+ LAST_PROP
+};
+
+enum {
+ ERROR,
+ LAST_SIGNAL
+};
+
+G_DEFINE_QUARK (xml_reader_error, xml_reader_error)
+G_DEFINE_TYPE (XmlReader, xml_reader, G_TYPE_OBJECT)
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+static guint gSignals [LAST_SIGNAL];
+
+#define XML_NODE_TYPE_ELEMENT 1
+#define XML_NODE_TYPE_END_ELEMENT 15
+#define XML_NODE_TYPE_ATTRIBUTE 2
+
+static void
+xml_reader_set_encoding (XmlReader *reader,
+ const gchar *encoding)
+{
+ g_return_if_fail (XML_IS_READER (reader));
+ g_free (reader->encoding);
+ reader->encoding = g_strdup (encoding);
+}
+
+static void
+xml_reader_set_uri (XmlReader *reader,
+ const gchar *uri)
+{
+ g_return_if_fail (XML_IS_READER (reader));
+ g_free (reader->uri);
+ reader->uri = g_strdup (uri);
+}
+
+static void
+xml_reader_clear (XmlReader *reader)
+{
+ g_return_if_fail(XML_IS_READER(reader));
+
+ g_free (reader->cur_name);
+ reader->cur_name = NULL;
+
+ if (reader->xml) {
+ xmlTextReaderClose(reader->xml);
+ xmlFreeTextReader(reader->xml);
+ reader->xml = NULL;
+ }
+
+ if (reader->stream) {
+ g_object_unref(reader->stream);
+ reader->stream = NULL;
+ }
+}
+
+static void
+xml_reader_finalize (GObject *object)
+{
+ XmlReader *reader = (XmlReader *)object;
+
+ xml_reader_clear (reader);
+
+ g_free (reader->encoding);
+ reader->encoding = NULL;
+
+ g_free (reader->uri);
+ reader->uri = NULL;
+
+ G_OBJECT_CLASS (xml_reader_parent_class)->finalize (object);
+}
+
+static void
+xml_reader_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ XmlReader *reader = (XmlReader *)object;
+
+ switch (prop_id)
+ {
+ case PROP_ENCODING:
+ g_value_set_string (value, reader->encoding);
+ break;
+
+ case PROP_URI:
+ g_value_set_string (value, reader->uri);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static void
+xml_reader_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ XmlReader *reader = (XmlReader *)object;
+
+ switch (prop_id)
+ {
+ case PROP_ENCODING:
+ xml_reader_set_encoding (reader, g_value_get_string (value));
+ break;
+
+ case PROP_URI:
+ xml_reader_set_uri (reader, g_value_get_string (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ }
+}
+
+static void
+xml_reader_class_init (XmlReaderClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = xml_reader_finalize;
+ object_class->get_property = xml_reader_get_property;
+ object_class->set_property = xml_reader_set_property;
+
+ gParamSpecs [PROP_ENCODING] =
+ g_param_spec_string ("encoding",
+ _("Encoding"),
+ _("Encoding"),
+ NULL,
+ (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gParamSpecs [PROP_URI] =
+ g_param_spec_string ("uri",
+ _("Uri"),
+ _("Uri"),
+ NULL,
+ (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
+
+ gSignals [ERROR] =
+ g_signal_new ("error",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL, NULL,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+}
+
+static void
+xml_reader_init (XmlReader *reader)
+{
+}
+
+XmlReader*
+xml_reader_new (void)
+{
+ return g_object_new (XML_TYPE_READER, NULL);
+}
+
+static void
+xml_reader_error_cb (void *arg,
+ const char *msg,
+ xmlParserSeverities severity,
+ xmlTextReaderLocatorPtr locator)
+{
+ XmlReader *reader = arg;
+
+ g_assert (XML_IS_READER (reader));
+
+ g_signal_emit (reader, gSignals [ERROR], 0, msg);
+}
+
+gboolean
+xml_reader_load_from_path (XmlReader *reader,
+ const gchar *path)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ xml_reader_clear (reader);
+
+ if ((reader->xml = xmlNewTextReaderFilename (path)))
+ xmlTextReaderSetErrorHandler (reader->xml, xml_reader_error_cb, reader);
+
+ return (reader->xml != NULL);
+}
+
+gboolean
+xml_reader_load_from_file (XmlReader *reader,
+ GFile *file,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GFileInputStream *stream;
+ gboolean ret;
+
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+ g_return_val_if_fail (G_IS_FILE (file), FALSE);
+ g_return_val_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable), FALSE);
+
+ if (!(stream = g_file_read (file, cancellable, error)))
+ return FALSE;
+
+ ret = xml_reader_load_from_stream (reader, G_INPUT_STREAM (stream), error);
+
+ g_clear_object (&stream);
+
+ return ret;
+}
+
+gboolean
+xml_reader_load_from_data (XmlReader *reader,
+ const gchar *data,
+ gsize length,
+ const gchar *uri,
+ const gchar *encoding)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ xml_reader_clear (reader);
+
+ if (length == -1)
+ length = strlen (data);
+
+ reader->xml = xmlReaderForMemory (data, length, uri, encoding, 0);
+ xmlTextReaderSetErrorHandler (reader->xml, xml_reader_error_cb, reader);
+
+ return (reader->xml != NULL);
+}
+
+static int
+xml_reader_io_read_cb (void *context,
+ char *buffer,
+ int len)
+{
+ GInputStream *stream = (GInputStream *)context;
+ g_return_val_if_fail (G_IS_INPUT_STREAM(stream), -1);
+ return g_input_stream_read (stream, buffer, len, NULL, NULL);
+}
+
+static int
+xml_reader_io_close_cb (void *context)
+{
+ GInputStream *stream = (GInputStream *)context;
+
+ g_return_val_if_fail (G_IS_INPUT_STREAM(stream), -1);
+
+ return g_input_stream_close (stream, NULL, NULL) ? 0 : -1;
+}
+
+gboolean
+xml_reader_load_from_stream (XmlReader *reader,
+ GInputStream *stream,
+ GError **error)
+{
+ g_return_val_if_fail (XML_IS_READER(reader), FALSE);
+
+ xml_reader_clear (reader);
+
+ reader->xml = xmlReaderForIO (xml_reader_io_read_cb,
+ xml_reader_io_close_cb,
+ stream,
+ reader->uri,
+ reader->encoding,
+ XML_PARSE_RECOVER | XML_PARSE_NOBLANKS | XML_PARSE_COMPACT);
+
+ if (!reader->xml)
+ {
+ g_set_error (error,
+ XML_READER_ERROR,
+ XML_READER_ERROR_INVALID,
+ _("Could not parse XML from stream"));
+ return FALSE;
+ }
+
+ reader->stream = g_object_ref (stream);
+
+ xmlTextReaderSetErrorHandler (reader->xml, xml_reader_error_cb, reader);
+
+ return TRUE;
+}
+
+G_CONST_RETURN gchar *
+xml_reader_get_value (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), NULL);
+
+ g_return_val_if_fail (reader->xml != NULL, NULL);
+
+ return XML_TO_CHAR (xmlTextReaderConstValue (reader->xml));
+}
+
+G_CONST_RETURN gchar *
+xml_reader_get_name (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), NULL);
+ g_return_val_if_fail (reader->xml != NULL, NULL);
+
+ return XML_TO_CHAR (xmlTextReaderConstName (reader->xml));
+}
+
+gchar *
+xml_reader_read_string (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), NULL);
+ g_return_val_if_fail (reader->xml != NULL, NULL);
+
+ RETURN_STRDUP_AND_XMLFREE (xmlTextReaderReadString (reader->xml));
+}
+
+gchar *
+xml_reader_get_attribute (XmlReader *reader,
+ const gchar *name)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), NULL);
+ g_return_val_if_fail (reader->xml != NULL, NULL);
+
+ RETURN_STRDUP_AND_XMLFREE (xmlTextReaderGetAttribute (reader->xml, CHAR_TO_XML (name)));
+}
+
+static gboolean
+read_to_type_and_name (XmlReader *reader,
+ gint type,
+ const gchar *name)
+{
+ gboolean success = FALSE;
+
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ g_return_val_if_fail (reader->xml != NULL, FALSE);
+
+ while (xmlTextReaderRead (reader->xml) == 1)
+ {
+ if (xmlTextReaderNodeType (reader->xml) == type)
+ {
+ if (g_strcmp0 (XML_TO_CHAR (xmlTextReaderConstName (reader->xml)), name) == 0)
+ {
+ success = TRUE;
+ break;
+ }
+ }
+ }
+
+ return success;
+}
+
+gboolean
+xml_reader_read_start_element (XmlReader *reader,
+ const gchar *name)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ if (read_to_type_and_name (reader, XML_NODE_TYPE_ELEMENT, name))
+ {
+ g_free (reader->cur_name);
+ reader->cur_name = g_strdup (name);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+gboolean
+xml_reader_read_end_element (XmlReader *reader)
+{
+ gboolean success = FALSE;
+
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ if (reader->cur_name)
+ success = read_to_type_and_name (reader, XML_NODE_TYPE_END_ELEMENT, reader->cur_name);
+
+ return success;
+}
+
+gchar *
+xml_reader_read_inner_xml (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ RETURN_STRDUP_AND_XMLFREE (xmlTextReaderReadInnerXml (reader->xml));
+}
+
+gchar*
+xml_reader_read_outer_xml (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ RETURN_STRDUP_AND_XMLFREE (xmlTextReaderReadOuterXml (reader->xml));
+}
+
+gboolean
+xml_reader_read_to_next (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return (xmlTextReaderNext (reader->xml) == 1);
+}
+
+gboolean
+xml_reader_read (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return (xmlTextReaderRead (reader->xml) == 1);
+}
+
+gboolean
+xml_reader_read_to_next_sibling (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ xmlTextReaderMoveToElement (reader->xml);
+
+ return (xmlTextReaderNextSibling (reader->xml) == 1);
+}
+
+gint
+xml_reader_get_depth (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER(reader), -1);
+
+ return xmlTextReaderDepth (reader->xml);
+}
+
+void
+xml_reader_move_up_to_depth (XmlReader *reader,
+ gint depth)
+{
+ g_return_if_fail(XML_IS_READER(reader));
+
+ while (xml_reader_get_depth(reader) > depth)
+ xml_reader_read_end_element(reader);
+}
+
+xmlReaderTypes
+xml_reader_get_node_type (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), 0);
+
+ return xmlTextReaderNodeType (reader->xml);
+}
+
+gboolean
+xml_reader_is_empty_element (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return xmlTextReaderIsEmptyElement (reader->xml);
+}
+
+gboolean
+xml_reader_is_a (XmlReader *reader,
+ const gchar *name)
+{
+ return (g_strcmp0 (xml_reader_get_name (reader), name) == 0);
+}
+
+gboolean
+xml_reader_is_a_local (XmlReader *reader,
+ const gchar *local_name)
+{
+ return (g_strcmp0 (xml_reader_get_local_name (reader), local_name) == 0);
+}
+
+gboolean
+xml_reader_is_namespace (XmlReader *reader,
+ const gchar *ns)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return (g_strcmp0 (XML_TO_CHAR(xmlTextReaderConstNamespaceUri (reader->xml)), ns) == 0);
+}
+
+G_CONST_RETURN gchar *
+xml_reader_get_local_name (XmlReader *reader)
+{
+ g_return_val_if_fail(XML_IS_READER (reader), NULL);
+
+ return XML_TO_CHAR (xmlTextReaderConstLocalName (reader->xml));
+}
+
+gboolean
+xml_reader_move_to_element (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return (xmlTextReaderMoveToElement (reader->xml) == 1);
+}
+
+gboolean
+xml_reader_move_to_attribute (XmlReader *reader,
+ const gchar *name)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return (xmlTextReaderMoveToAttribute (reader->xml, CHAR_TO_XML (name)) == 1);
+}
+
+gboolean
+xml_reader_move_to_first_attribute (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return (xmlTextReaderMoveToFirstAttribute (reader->xml) == 1);
+}
+
+gboolean
+xml_reader_move_to_next_attribute (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return (xmlTextReaderMoveToNextAttribute (reader->xml) == 1);
+}
+
+gboolean
+xml_reader_move_to_nth_attribute (XmlReader *reader,
+ gint nth)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return (xmlTextReaderMoveToAttributeNo (reader->xml, nth) == 1);
+}
+
+gint
+xml_reader_count_attributes (XmlReader *reader)
+{
+ g_return_val_if_fail (XML_IS_READER (reader), FALSE);
+
+ return xmlTextReaderAttributeCount (reader->xml);
+}
+
+gint
+xml_reader_get_line_number (XmlReader *reader)
+{
+ g_return_val_if_fail(XML_IS_READER(reader), -1);
+
+ if (reader->xml)
+ return xmlTextReaderGetParserLineNumber(reader->xml);
+
+ return -1;
+}
diff --git a/contrib/xml/xml-reader.h b/contrib/xml/xml-reader.h
new file mode 100644
index 0000000..cfdfa53
--- /dev/null
+++ b/contrib/xml/xml-reader.h
@@ -0,0 +1,100 @@
+/* xml-reader.h
+ *
+ * Copyright (C) 2009 Christian Hergert <chris dronelabs com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that 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.
+ *
+ * Author:
+ * Christian Hergert <chris dronelabs com>
+ *
+ * Based upon work by:
+ * Emmanuele Bassi
+ */
+
+#ifndef XML_READER_H
+#define XML_READER_H
+
+#include <gio/gio.h>
+#include <libxml/xmlreader.h>
+
+G_BEGIN_DECLS
+
+#define XML_TYPE_READER (xml_reader_get_type ())
+
+#define XML_READER_ERROR (xml_reader_error_quark())
+
+G_DECLARE_FINAL_TYPE (XmlReader, xml_reader, XML, READER, GObject)
+
+typedef enum
+{
+ XML_READER_ERROR_INVALID,
+} XmlReaderError;
+
+GQuark xml_reader_error_quark (void);
+XmlReader *xml_reader_new (void);
+gboolean xml_reader_load_from_path (XmlReader *reader,
+ const gchar *path);
+gboolean xml_reader_load_from_file (XmlReader *reader,
+ GFile *file,
+ GCancellable *cancellable,
+ GError **error);
+gboolean xml_reader_load_from_data (XmlReader *reader,
+ const gchar *data,
+ gsize length,
+ const gchar *uri,
+ const gchar *encoding);
+gboolean xml_reader_load_from_stream (XmlReader *reader,
+ GInputStream *stream,
+ GError **error);
+
+gint xml_reader_get_depth (XmlReader *reader);
+xmlReaderTypes xml_reader_get_node_type (XmlReader *reader);
+const gchar *xml_reader_get_value (XmlReader *reader);
+const gchar *xml_reader_get_name (XmlReader *reader);
+const gchar *xml_reader_get_local_name (XmlReader *reader);
+gchar *xml_reader_read_string (XmlReader *reader);
+gchar *xml_reader_get_attribute (XmlReader *reader,
+ const gchar *name);
+gboolean xml_reader_is_a (XmlReader *reader,
+ const gchar *name);
+gboolean xml_reader_is_a_local (XmlReader *reader,
+ const gchar *local_name);
+gboolean xml_reader_is_namespace (XmlReader *reader,
+ const gchar *ns);
+gboolean xml_reader_is_empty_element (XmlReader *reader);
+
+gboolean xml_reader_read_start_element (XmlReader *reader,
+ const gchar *name);
+gboolean xml_reader_read_end_element (XmlReader *reader);
+
+gchar *xml_reader_read_inner_xml (XmlReader *reader);
+gchar *xml_reader_read_outer_xml (XmlReader *reader);
+
+gboolean xml_reader_read (XmlReader *reader);
+gboolean xml_reader_read_to_next (XmlReader *reader);
+gboolean xml_reader_read_to_next_sibling (XmlReader *reader);
+
+gboolean xml_reader_move_to_element (XmlReader *reader);
+gboolean xml_reader_move_to_attribute (XmlReader *reader,
+ const gchar *name);
+void xml_reader_move_up_to_depth (XmlReader *reader,
+ gint depth);
+
+gboolean xml_reader_move_to_first_attribute (XmlReader *reader);
+gboolean xml_reader_move_to_next_attribute (XmlReader *reader);
+gint xml_reader_count_attributes (XmlReader *reader);
+gboolean xml_reader_move_to_nth_attribute (XmlReader *reader,
+ gint nth);
+gint xml_reader_get_line_number (XmlReader *reader);
+
+G_END_DECLS
+
+#endif /* XML_READER_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]