updated with instructions for support of both libxml-1.x and libxml-2.x

* doc/upgrade.html: updated with instructions for support of both
  libxml-1.x and libxml-2.x
* doc/gjobread.c : applied Todd Dukes <tdukes@ibmoto.com> patch
  for 2.x support and also fixed includes
Daniel
diff --git a/ChangeLog b/ChangeLog
index 5361b29..f59cced 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Sat May  6 10:09:45 CEST 2000 Daniel Veillard <Daniel.Veillard@w3.org>
+
+	* doc/upgrade.html: updated with instructions for support of both
+	  libxml-1.x and libxml-2.x
+	* doc/gjobread.c : applied Todd Dukes <tdukes@ibmoto.com> patch
+	  for 2.x support and also fixed includes
+
+
 Wed May  3 14:21:25 CEST 2000 Daniel Veillard <Daniel.Veillard@w3.org>
 
 	* encoding.[ch], xmlIO.[ch], parser.c, configure.in : revamped
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 658de2a..b261c0f 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -3,13 +3,15 @@
 <html>
 <head>
   <title>Upgrading libxml client code from 1.x to 2.x</title>
-  <meta name="GENERATOR" content="amaya V2.4">
+  <meta name="GENERATOR" content="amaya V3.1">
   <meta http-equiv="Content-Type" content="text/html">
 </head>
 
 <body bgcolor="#ffffff">
 <h1 align="center">Upgrading libxml client code from 1.x to 2.x</h1>
 
+<h2>Incompatible changes:</h2>
+
 <p>Version 2 of libxml is the first version introducing serious backward
 incompatible changes. The main goals were:</p>
 <ul>
@@ -27,6 +29,8 @@
     before.</li>
 </ul>
 
+<h2>How to fix libxml-1.x code:</h2>
+
 <p>So client code of libxml designed to run with version 1.x may have to be
 changed to compile against version 2.x of libxml. Here is a list of changes
 that I have collected, they may not be sufficient, so in case you find other
@@ -83,18 +87,61 @@
     <pre>xml-config --cflags</pre>
     <p>output to generate you compile commands this will probably work out of
     the box</p>
-    <p></p>
   </li>
 </ol>
 
+<h2>Keeping both libxml-1.x and libxml-2.x compatibility:</h2>
+
+<p>Here is the steps i applied successfully to a couple of gnome project
+dependant on libxml to allow compilation under both environments:</p>
+<ol>
+  <li>make sure your configure adds the output of  "xml-config --cflags" to
+    the compiler command line</li>
+  <li>in your C files including libxml includes do the following
+    <pre>#include &lt;xmlmemory.h>
+#if defined(LIBXML_VERSION) &amp;&amp; LIBXML_VERSION >= 20000
+#include &lt;libxml/parser.h>
+#include &lt;libxml/tree.h>
+#define root children
+#define childs children
+#else 
+#include &lt;gnome-xml/parser.h>
+#include &lt;gnome-xml/tree.h>
+#endif</pre>
+    <p>the first include name is really specific to libxml and won't clash
+    with other installed softare includes. Once included we can tell          
+         the version used and use prefixed path for the includes to safely
+    include headers like tree.h .</p>
+    <p>Second the two #defines allows to handle changes dones in the names of
+    public structures. Just make sure that you don't use the "root" name for
+    other structure in your module. Using xmlDocGetRootElement(doc) is the
+    proper way to access the root node now but is not available on old libxml
+    version (but present in 1.8.7).</p>
+  </li>
+  <li>libxml-2 generates "empty" text nodes for "formatting spaces" found in
+    the XML input. The proper way to handle this change is to check them (and
+    ignore them) when scanning an XML tree produced after libxml parsing. The
+    quick and dirty solution is to force libxml to the old behaviour of
+    ignoring those formatting spaces by adding the following code before any
+    call to the XML parser:
+    <pre>#if defined(LIBXML_VERSION) &amp;&amp; LIBXML_VERSION >= 20000
+  xmlKeepBlanksDefault(0);
+#endif</pre>
+  </li>
+</ol>
+
+<p>Following those 3 steps should work. It worked for some of my own code and
+for the gnome-print module. Other modules (including bonobo/gconf/nautilus)
+will have to be patched in the same way. </p>
+
 <p>Let me put some emphasis on the fact that there is far more changes from
-libxml 1.x to 2.x than the ones you may have to pacth for. The overall code
+libxml 1.x to 2.x than the ones you may have to patch for. The overall code
 has been considerably improved and the conformance to the XML specification
 has been drastically improve. Don't take those changes as an excuse to not
 upgrade, it may cost a lot on the long term ...</p>
 
 <p><a href="mailto:Daniel.Veillard@w3.org">Daniel Veillard</a></p>
 
-<p>$Id: upgrade.html,v 1.3 2000/04/03 19:48:13 veillard Exp $</p>
+<p>$Id: upgrade.html,v 1.4 2000/04/12 13:27:38 veillard Exp $</p>
 </body>
 </html>
diff --git a/example/gjobread.c b/example/gjobread.c
index ce3f31b..ca38671 100644
--- a/example/gjobread.c
+++ b/example/gjobread.c
@@ -10,7 +10,12 @@
 #include <string.h>
 #include <stdlib.h>
 
-#include "parser.h"
+#include <xmlmemory.h>
+#if defined(LIBXML_VERSION) && LIBXML_VERSION >= 20000
+#include <libxml/parser.h>
+#else 
+#include <gnome-xml/parser.h>
+#endif
 
 #define DEBUG(x) printf(x)
 
@@ -45,12 +50,12 @@
     memset(ret, 0, sizeof(person));
 
     /* We don't care what the top level element name is */
-    cur = cur->childs;
+    cur = cur->children;
     while (cur != NULL) {
         if ((!strcmp(cur->name, "Person")) && (cur->ns == ns))
-	    ret->name = xmlNodeListGetString(doc, cur->childs, 1);
+	    ret->name = xmlNodeListGetString(doc, cur->children, 1);
         if ((!strcmp(cur->name, "Email")) && (cur->ns == ns))
-	    ret->email = xmlNodeListGetString(doc, cur->childs, 1);
+	    ret->email = xmlNodeListGetString(doc, cur->children, 1);
 	cur = cur->next;
     }
 
@@ -103,7 +108,7 @@
     memset(ret, 0, sizeof(job));
 
     /* We don't care what the top level element name is */
-    cur = cur->childs;
+    cur = cur->children;
     while (cur != NULL) {
         
         if ((!strcmp(cur->name, "Project")) && (cur->ns == ns)) {
@@ -113,9 +118,9 @@
 	    }
 	}
         if ((!strcmp(cur->name, "Application")) && (cur->ns == ns))
-	    ret->application = xmlNodeListGetString(doc, cur->childs, 1);
+	    ret->application = xmlNodeListGetString(doc, cur->children, 1);
         if ((!strcmp(cur->name, "Category")) && (cur->ns == ns))
-	    ret->category = xmlNodeListGetString(doc, cur->childs, 1);
+	    ret->category = xmlNodeListGetString(doc, cur->children, 1);
         if ((!strcmp(cur->name, "Contact")) && (cur->ns == ns))
 	    ret->contact = parsePerson(doc, ns, cur);
 	cur = cur->next;
@@ -167,7 +172,10 @@
     /*
      * Check the document is of the right kind
      */
-    cur = doc->root;
+    
+    //    cur = doc->root;
+    //    cur = doc->children;
+    cur = xmlDocGetRootElement(doc);
     if (cur == NULL) {
         fprintf(stderr,"empty document\n");
 	xmlFreeDoc(doc);
@@ -201,16 +209,27 @@
      * Now, walk the tree.
      */
     /* First level we expect just Jobs */
-    cur = cur->childs;
+    //    cur = cur->children;
+    cur = cur -> children;
+    while ( cur && xmlIsBlankNode ( cur ) )
+      {
+	cur = cur -> next;
+      }
+    if ( cur == 0 )
+      return ( NULL );
     if ((strcmp(cur->name, "Jobs")) || (cur->ns != ns)) {
-        fprintf(stderr,"document of the wrong type, Jobs expected");
+        fprintf(stderr,"document of the wrong type, was '%s', Jobs expected",
+		cur->name);
+	fprintf(stderr,"xmlDocDump follows\n");
+	xmlDocDump ( stderr, doc );
+	fprintf(stderr,"xmlDocDump finished\n");
 	xmlFreeDoc(doc);
 	free(ret);
 	return(NULL);
     }
 
     /* Second level is a list of Job, but be laxist */
-    cur = cur->childs;
+    cur = cur->children;
     while (cur != NULL) {
         if ((!strcmp(cur->name, "Job")) && (cur->ns == ns)) {
 	    job = parseJob(doc, ns, cur);
@@ -240,7 +259,11 @@
 
     for (i = 1; i < argc ; i++) {
 	cur = parseGjobFile(argv[i]);
-	handleGjob(cur);
+	if ( cur )
+	  handleGjob(cur);
+	else
+	  fprintf( stderr, "Error parsing file '%s'\n", argv[i]);
+
     }
     return(0);
 }