diff options
author | Lars Gustäbel <lars@gustaebel.de> | 2000-09-21 08:34:04 (GMT) |
---|---|---|
committer | Lars Gustäbel <lars@gustaebel.de> | 2000-09-21 08:34:04 (GMT) |
commit | ae43e5205d7eec667e86c6dbf6714ec2fc12cf26 (patch) | |
tree | 63b2878ab364c5492672debdc9b631f8f5eac329 /Lib/xml | |
parent | c5cec51b95dadf0740c0c10260ae5011a4bb3ea5 (diff) | |
download | cpython-ae43e5205d7eec667e86c6dbf6714ec2fc12cf26.zip cpython-ae43e5205d7eec667e86c6dbf6714ec2fc12cf26.tar.gz cpython-ae43e5205d7eec667e86c6dbf6714ec2fc12cf26.tar.bz2 |
Added the make_parser function (patch 101571).
Diffstat (limited to 'Lib/xml')
-rw-r--r-- | Lib/xml/sax/__init__.py | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/Lib/xml/sax/__init__.py b/Lib/xml/sax/__init__.py index 69c44ad..c603436 100644 --- a/Lib/xml/sax/__init__.py +++ b/Lib/xml/sax/__init__.py @@ -22,7 +22,6 @@ expatreader -- Driver that allows use of the Expat parser with the """ from handler import ContentHandler, ErrorHandler -from expatreader import ExpatParser from _exceptions import SAXException, SAXNotRecognizedException, \ SAXParseException, SAXNotSupportedException @@ -33,7 +32,6 @@ def parse(filename_or_stream, handler, errorHandler=ErrorHandler()): parser.setErrorHandler(errorHandler) parser.parse(filename_or_stream) - def parseString(string, handler, errorHandler=ErrorHandler()): try: from cStringIO import StringIO @@ -46,3 +44,70 @@ def parseString(string, handler, errorHandler=ErrorHandler()): parser.setContentHandler(handler) parser.setErrorHandler(errorHandler) parser.parse(StringIO(string)) + +# this is the parser list used by the make_parser function if no +# alternatives are given as parameters to the function + +default_parser_list = ["xml.sax.expatreader"] + +import os, string, sys +if os.environ.has_key("PY_SAX_PARSER"): + default_parser_list = string.split(os.environ["PY_SAX_PARSER"], ",") +del os + +_key = "python.xml.sax.parser" +if sys.platform[:4] == "java" and sys.registry.containsKey(_key): + default_parser_list = string.split(sys.registry.getProperty(_key), ",") + + +def make_parser(parser_list = []): + """Creates and returns a SAX parser. + + Creates the first parser it is able to instantiate of the ones + given in the list created by doing parser_list + + default_parser_list. The lists must contain the names of Python + modules containing both a SAX parser and a create_parser function.""" + + for parser_name in parser_list + default_parser_list: + try: + return _create_parser(parser_name) + except ImportError,e: + pass + + raise SAXException("No parsers found", None) + +# --- Internal utility methods used by make_parser + +if sys.platform[ : 4] == "java": + def _create_parser(parser_name): + from org.python.core import imp + drv_module = imp.importName(parser_name, 0, globals()) + 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 = apply(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 = apply(imp.load_module, info) + return drv_module.create_parser() + +del sys |