[libgsf] xml: don't complain over elements in unknown namespaces.



commit 80c2798d8b0ee2675fb347b9d03479cb3c81110d
Author: Morten Welinder <terra gnome org>
Date:   Sat Sep 25 12:48:20 2010 -0400

    xml: don't complain over elements in unknown namespaces.

 ChangeLog        |    5 +++++
 NEWS             |    2 +-
 gsf/gsf-libxml.c |   21 +++++++++++++++++++++
 3 files changed, 27 insertions(+), 1 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 2a98ac5..85f41a6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2010-09-25  Morten Welinder  <terra gnome org>
+
+	* gsf/gsf-libxml.c (gsf_xml_in_start_element): Don't complain over
+	elements in unknown namespaces.
+
 2010-09-15  Andreas J. Guelzow <aguelzow pyrshep ca>
 
 	* gsf/gsf-opendoc-utils.c (gsf_ooo_ns): add another one of OOo's
diff --git a/NEWS b/NEWS
index f7932ab..614834e 100644
--- a/NEWS
+++ b/NEWS
@@ -4,7 +4,7 @@ Andreas:
 	* Add some more OOo 3.2 and 3.3 namespaces.
 
 Morten:
-	* Quiet xml parsing a bit.
+	* Quiet xml parsing two bits.
 
 --------------------------------------------------------------------------
 libgsf 1.14.18
diff --git a/gsf/gsf-libxml.c b/gsf/gsf-libxml.c
index f56ddc2..4bfa0ff 100644
--- a/gsf/gsf-libxml.c
+++ b/gsf/gsf-libxml.c
@@ -541,6 +541,7 @@ typedef struct {
 	GSList	 	 *ns_stack;
 	GHashTable	 *ns_prefixes;
 	GPtrArray	 *ns_by_id;
+	GHashTable	 *ns_unknowns;
 	GSList	 	 *contents_stack;
 	gboolean          initialized;
 	gint	  	  unknown_depth; /* handle recursive unknown tags */
@@ -658,6 +659,7 @@ gsf_xml_in_start_element (GsfXMLInInternal *state, xmlChar const *name, xmlChar
 	GSList *ptr;
 	char const *tmp;
 	int i;
+	gboolean complain = TRUE;
 
 	/* Scan for namespace declarations.  Yes it is ugly to have the api
 	 * flag that its children can declare namespaces. However, given that a
@@ -703,6 +705,8 @@ gsf_xml_in_start_element (GsfXMLInInternal *state, xmlChar const *name, xmlChar
 			}
 
 			if (NULL == tmp) {
+				char *s = g_strdup (ns_ptr[0] + 6);
+				g_hash_table_replace (state->ns_unknowns, s, s);
 				if (gsf_debug_flag ("ns"))
 					g_warning ("Unknown namespace uri = '%s'", ns_ptr[1]);
 			}
@@ -741,6 +745,17 @@ gsf_xml_in_start_element (GsfXMLInInternal *state, xmlChar const *name, xmlChar
 	if (state->unknown_depth++ > 0)
 		return;
 
+	tmp = strchr (name, ':');
+	if (tmp) {
+		char *nsstr = g_strndup (name, tmp - (const char *)name);
+		if (g_hash_table_lookup (state->ns_unknowns, nsstr))
+			complain = FALSE;
+		g_free (nsstr);
+	}
+
+	if (!complain)
+		return;
+
 	g_printerr ("Unexpected element '%s' in state : \n\t", name);
 	ptr = state->pub.node_stack = g_slist_reverse (state->pub.node_stack);
 	if (ptr != NULL)	/* skip toplevel catch all */
@@ -872,6 +887,9 @@ gsf_xml_in_start_document (GsfXMLInInternal *state)
 	state->ns_prefixes	= g_hash_table_new_full (
 		g_str_hash, g_str_equal,
 		g_free, (GDestroyNotify) gsf_free_xmlinnsinstance);
+	state->ns_unknowns	= g_hash_table_new_full (
+		g_str_hash, g_str_equal,
+		g_free, NULL);
 	state->contents_stack	= NULL;
 	state->from_unknown_handler = FALSE;
 }
@@ -889,6 +907,9 @@ gsf_xml_in_end_document (GsfXMLInInternal *state)
 		g_hash_table_destroy (state->ns_prefixes);
 		state->ns_prefixes = NULL;
 
+		g_hash_table_destroy (state->ns_unknowns);
+		state->ns_unknowns = NULL;
+
 		state->initialized = FALSE;
 
 		if (state->pub.node != &state->pub.doc->root_node->pub) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]