[Patch 101634]
xml.sax: Fix parse and parseString not to rely on ExpatParser
         Greatly simplify import logic by using __import__
saxutils: Support Unicode strings and files as parameters to
          prepare_input_source
diff --git a/Lib/xml/sax/__init__.py b/Lib/xml/sax/__init__.py
index 7c62ea1..1f1f58e 100644
--- a/Lib/xml/sax/__init__.py
+++ b/Lib/xml/sax/__init__.py
@@ -26,7 +26,7 @@
 
 
 def parse(source, handler, errorHandler=ErrorHandler()):
-    parser = ExpatParser()
+    parser = make_parser()
     parser.setContentHandler(handler)
     parser.setErrorHandler(errorHandler)
     parser.parse(source)
@@ -39,7 +39,7 @@
         
     if errorHandler is None:
         errorHandler = ErrorHandler()
-    parser = ExpatParser()
+    parser = make_parser()
     parser.setContentHandler(handler)
     parser.setErrorHandler(errorHandler)
 
@@ -87,29 +87,8 @@
         return drv_module.create_parser()
 
 else:
-    import imp as _imp
-
-    def _rec_find_module(module):
-        "Improvement over imp.find_module which finds submodules."
-        path=""
-        for mod in string.split(module,"."):
-            if path == "":
-                info = (mod,) + _imp.find_module(mod)
-            else:
-                info = (mod,) + _imp.find_module(mod, [path])
-                
-            lastmod = _imp.load_module(*info)
-
-            try:
-                path = lastmod.__path__[0]
-            except AttributeError, e:
-                pass
-
-        return info
-
     def _create_parser(parser_name):
-        info = _rec_find_module(parser_name)
-        drv_module = _imp.load_module(*info)
+        drv_module = __import__(parser_name,{},{},['create_parser'])
         return drv_module.create_parser()
 
 del sys
diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py
index 8f8f42e..3f130f3 100644
--- a/Lib/xml/sax/saxutils.py
+++ b/Lib/xml/sax/saxutils.py
@@ -3,10 +3,12 @@
 convenience of application and driver writers.
 """
 
-import os, urlparse, urllib
+import os, urlparse, urllib, types
 import handler
 import xmlreader
 
+_StringTypes = [types.StringType, types.UnicodeType]
+
 def escape(data, entities={}):
     """Escape &, <, and > in a string of data.
 
@@ -189,8 +191,12 @@
     """This function takes an InputSource and an optional base URL and
     returns a fully resolved InputSource object ready for reading."""
     
-    if type(source) == type(""):
+    if type(source) in _StringTypes:
         source = xmlreader.InputSource(source)
+    elif hasattr(source, "read"):
+        f = source
+        source = xmlreader.InputSource(source)
+        source.setByteStream(f)
 
     if source.getByteStream() == None:
         sysid = source.getSystemId()