Index: gdal/ogr/ogrsf_frmts/gml/gmlhandler.cpp
===================================================================
--- gdal/ogr/ogrsf_frmts/gml/gmlhandler.cpp	(revision 17880)
+++ gdal/ogr/ogrsf_frmts/gml/gmlhandler.cpp	(working copy)
@@ -115,10 +115,27 @@
 }
 
 /************************************************************************/
-/*                             characters()                             */
+/*                             characters() (xerces 3 version)          */
 /************************************************************************/
 
 void GMLXercesHandler::characters(const XMLCh* const chars_in,
+                                  const XMLSize_t length )
+{
+    char* utf8String = tr_strdup(chars_in);
+    int nLen = strlen(utf8String);
+    OGRErr eErr = GMLHandler::dataHandler(utf8String, nLen);
+    CPLFree(utf8String);
+    if (eErr == CE_Failure)
+    {
+        throw SAXNotSupportedException("Out of memory");
+    }
+}
+
+/************************************************************************/
+/*                             characters() (xerces 2 version)          */
+/************************************************************************/
+
+void GMLXercesHandler::characters(const XMLCh* const chars_in,
                                   const unsigned int length )
 
 {
Index: gdal/ogr/ogrsf_frmts/gml/gmlreaderp.h
===================================================================
--- gdal/ogr/ogrsf_frmts/gml/gmlreaderp.h	(revision 17880)
+++ gdal/ogr/ogrsf_frmts/gml/gmlreaderp.h	(working copy)
@@ -119,6 +119,8 @@
         const   XMLCh* const    qname
     );
     void characters( const XMLCh *const chars,
+                     const XMLSize_t length );
+    void characters( const XMLCh *const chars,
                      const unsigned int length );
 
     void fatalError(const SAXParseException&);
Index: gdal/ogr/ogrsf_frmts/ili/iom/reader.cpp
===================================================================
--- gdal/ogr/ogrsf_frmts/ili/iom/reader.cpp	(revision 17880)
+++ gdal/ogr/ogrsf_frmts/ili/iom/reader.cpp	(working copy)
@@ -834,20 +834,38 @@
 }
 
 
+/************************************************************************/
+/*                     characters() (xerces 3 version)                  */
+/************************************************************************/
 
-void ParserHandler::characters(  const   XMLCh* const    chars
-								    , const unsigned int    length)
+void ParserHandler::characters( const XMLCh* const chars,
+                                const XMLSize_t length )
 {
-	if(state==ST_BEFORE_CHARACTERS
-			|| state==CV_C1
-			|| state==CV_C2
-			|| state==CV_C3
-			){
-		propertyValue.append(chars,length);
-	}
+    if(   state==ST_BEFORE_CHARACTERS
+       || state==CV_C1
+       || state==CV_C2
+       || state==CV_C3 )
+    {
+        propertyValue.append(chars,length);
+    }
 }
 
+/************************************************************************/
+/*                     characters() (xerces 2 version)                  */
+/************************************************************************/
 
+void ParserHandler::characters( const XMLCh* const chars,
+                                const unsigned int length )
+{
+    if(   state==ST_BEFORE_CHARACTERS
+       || state==CV_C1
+       || state==CV_C2
+       || state==CV_C3 )
+    {
+        propertyValue.append(chars,length);
+    }
+}
+
 void ParserHandler::error(const SAXParseException& e)
 {
 #if 0
Index: gdal/ogr/ogrsf_frmts/ili/iom/iom_p.h
===================================================================
--- gdal/ogr/ogrsf_frmts/ili/iom/iom_p.h	(revision 17880)
+++ gdal/ogr/ogrsf_frmts/ili/iom/iom_p.h	(working copy)
@@ -540,12 +540,14 @@
 
 public:
 	// SAX handler
-	void  characters (const XMLCh *const chars, const unsigned int length);
+	void  characters (const XMLCh *const chars, const XMLSize_t length); // xerces 3
+	void  characters (const XMLCh *const chars, const unsigned int length); // xerces 2
 	// void  startDocument ();
 	// void  endDocument ();
 	void  startElement (const XMLCh *const uri, const XMLCh *const localname, const XMLCh *const qname, const Attributes &attrs);
 	void  endElement (const XMLCh *const uri, const XMLCh *const localname, const XMLCh *const qname);
-	// void  ignorableWhitespace (const XMLCh *const chars, const unsigned int length);
+	// void  ignorableWhitespace (const XMLCh *const chars, const XMLSize_t length); // xerces 3
+	// void  ignorableWhitespace (const XMLCh *const chars, const unsigned int length); // xerces 2
 	// void  processingInstruction (const XMLCh *const target, const XMLCh *const data); 
 	void  setDocumentLocator (const Locator *const locator);
 	// void  startPrefixMapping (const XMLCh *const prefix, const XMLCh *const uri);
Index: gdal/ogr/ogrsf_frmts/ili/ili2readerp.h
===================================================================
--- gdal/ogr/ogrsf_frmts/ili/ili2readerp.h	(revision 17880)
+++ gdal/ogr/ogrsf_frmts/ili/ili2readerp.h	(working copy)
@@ -100,7 +100,9 @@
         const   XMLCh* const    qname
     );
     void characters( const XMLCh *const chars,
-                     const unsigned int length );
+                     const XMLSize_t length ); // xerces 3
+    void characters( const XMLCh *const chars,
+                     const unsigned int length ); // xerces 2
 
     void startEntity (const XMLCh *const name);
 
Index: gdal/ogr/ogrsf_frmts/ili/ili2handler.cpp
===================================================================
--- gdal/ogr/ogrsf_frmts/ili/ili2handler.cpp	(revision 17880)
+++ gdal/ogr/ogrsf_frmts/ili/ili2handler.cpp	(working copy)
@@ -148,7 +148,30 @@
   }
 }
 
+/************************************************************************/
+/*                     characters() (xerces 3 version)                  */
+/************************************************************************/
+
 void ILI2Handler::characters( const XMLCh *const chars,
+                     const XMLSize_t length ) {
+  
+  // add the text element
+  if (level >= 3) {
+    char *tmpC = XMLString::transcode(chars);
+    
+    // only add the text if it is not empty
+    if (trim(tmpC) != "") 
+      dom_elem->appendChild(dom_doc->createTextNode(chars));
+    
+    XMLString::release(&tmpC);
+  }
+}
+
+/************************************************************************/
+/*                     characters() (xerces 2 version)                  */
+/************************************************************************/
+
+void ILI2Handler::characters( const XMLCh *const chars,
                      const unsigned int length ) {
   
   // add the text element

