Home | History | Annotate | Download | only in sax
      1 """Simple API for XML (SAX) implementation for Python.
      2 
      3 This module provides an implementation of the SAX 2 interface;
      4 information about the Java version of the interface can be found at
      5 http://www.megginson.com/SAX/.  The Python version of the interface is
      6 documented at <...>.
      7 
      8 This package contains the following modules:
      9 
     10 handler -- Base classes and constants which define the SAX 2 API for
     11            the 'client-side' of SAX for Python.
     12 
     13 saxutils -- Implementation of the convenience classes commonly used to
     14             work with SAX.
     15 
     16 xmlreader -- Base classes and constants which define the SAX 2 API for
     17              the parsers used with SAX for Python.
     18 
     19 expatreader -- Driver that allows use of the Expat parser with SAX.
     20 """
     21 
     22 from xmlreader import InputSource
     23 from handler import ContentHandler, ErrorHandler
     24 from _exceptions import SAXException, SAXNotRecognizedException, \
     25                         SAXParseException, SAXNotSupportedException, \
     26                         SAXReaderNotAvailable
     27 
     28 
     29 def parse(source, handler, errorHandler=ErrorHandler()):
     30     parser = make_parser()
     31     parser.setContentHandler(handler)
     32     parser.setErrorHandler(errorHandler)
     33     parser.parse(source)
     34 
     35 def parseString(string, handler, errorHandler=ErrorHandler()):
     36     try:
     37         from cStringIO import StringIO
     38     except ImportError:
     39         from StringIO import StringIO
     40 
     41     if errorHandler is None:
     42         errorHandler = ErrorHandler()
     43     parser = make_parser()
     44     parser.setContentHandler(handler)
     45     parser.setErrorHandler(errorHandler)
     46 
     47     inpsrc = InputSource()
     48     inpsrc.setByteStream(StringIO(string))
     49     parser.parse(inpsrc)
     50 
     51 # this is the parser list used by the make_parser function if no
     52 # alternatives are given as parameters to the function
     53 
     54 default_parser_list = ["xml.sax.expatreader"]
     55 
     56 # tell modulefinder that importing sax potentially imports expatreader
     57 _false = 0
     58 if _false:
     59     import xml.sax.expatreader
     60 
     61 import os, sys
     62 if "PY_SAX_PARSER" in os.environ:
     63     default_parser_list = os.environ["PY_SAX_PARSER"].split(",")
     64 del os
     65 
     66 _key = "python.xml.sax.parser"
     67 if sys.platform[:4] == "java" and sys.registry.containsKey(_key):
     68     default_parser_list = sys.registry.getProperty(_key).split(",")
     69 
     70 
     71 def make_parser(parser_list = []):
     72     """Creates and returns a SAX parser.
     73 
     74     Creates the first parser it is able to instantiate of the ones
     75     given in the list created by doing parser_list +
     76     default_parser_list.  The lists must contain the names of Python
     77     modules containing both a SAX parser and a create_parser function."""
     78 
     79     for parser_name in parser_list + default_parser_list:
     80         try:
     81             return _create_parser(parser_name)
     82         except ImportError,e:
     83             import sys
     84             if parser_name in sys.modules:
     85                 # The parser module was found, but importing it
     86                 # failed unexpectedly, pass this exception through
     87                 raise
     88         except SAXReaderNotAvailable:
     89             # The parser module detected that it won't work properly,
     90             # so try the next one
     91             pass
     92 
     93     raise SAXReaderNotAvailable("No parsers found", None)
     94 
     95 # --- Internal utility methods used by make_parser
     96 
     97 if sys.platform[ : 4] == "java":
     98     def _create_parser(parser_name):
     99         from org.python.core import imp
    100         drv_module = imp.importName(parser_name, 0, globals())
    101         return drv_module.create_parser()
    102 
    103 else:
    104     def _create_parser(parser_name):
    105         drv_module = __import__(parser_name,{},{},['create_parser'])
    106         return drv_module.create_parser()
    107 
    108 del sys
    109