17db96d56Sopenharmony_ci"""Simple API for XML (SAX) implementation for Python. 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciThis module provides an implementation of the SAX 2 interface; 47db96d56Sopenharmony_ciinformation about the Java version of the interface can be found at 57db96d56Sopenharmony_cihttp://www.megginson.com/SAX/. The Python version of the interface is 67db96d56Sopenharmony_cidocumented at <...>. 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ciThis package contains the following modules: 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_cihandler -- Base classes and constants which define the SAX 2 API for 117db96d56Sopenharmony_ci the 'client-side' of SAX for Python. 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_cisaxutils -- Implementation of the convenience classes commonly used to 147db96d56Sopenharmony_ci work with SAX. 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_cixmlreader -- Base classes and constants which define the SAX 2 API for 177db96d56Sopenharmony_ci the parsers used with SAX for Python. 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ciexpatreader -- Driver that allows use of the Expat parser with SAX. 207db96d56Sopenharmony_ci""" 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_cifrom .xmlreader import InputSource 237db96d56Sopenharmony_cifrom .handler import ContentHandler, ErrorHandler 247db96d56Sopenharmony_cifrom ._exceptions import SAXException, SAXNotRecognizedException, \ 257db96d56Sopenharmony_ci SAXParseException, SAXNotSupportedException, \ 267db96d56Sopenharmony_ci SAXReaderNotAvailable 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_cidef parse(source, handler, errorHandler=ErrorHandler()): 307db96d56Sopenharmony_ci parser = make_parser() 317db96d56Sopenharmony_ci parser.setContentHandler(handler) 327db96d56Sopenharmony_ci parser.setErrorHandler(errorHandler) 337db96d56Sopenharmony_ci parser.parse(source) 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_cidef parseString(string, handler, errorHandler=ErrorHandler()): 367db96d56Sopenharmony_ci import io 377db96d56Sopenharmony_ci if errorHandler is None: 387db96d56Sopenharmony_ci errorHandler = ErrorHandler() 397db96d56Sopenharmony_ci parser = make_parser() 407db96d56Sopenharmony_ci parser.setContentHandler(handler) 417db96d56Sopenharmony_ci parser.setErrorHandler(errorHandler) 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci inpsrc = InputSource() 447db96d56Sopenharmony_ci if isinstance(string, str): 457db96d56Sopenharmony_ci inpsrc.setCharacterStream(io.StringIO(string)) 467db96d56Sopenharmony_ci else: 477db96d56Sopenharmony_ci inpsrc.setByteStream(io.BytesIO(string)) 487db96d56Sopenharmony_ci parser.parse(inpsrc) 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci# this is the parser list used by the make_parser function if no 517db96d56Sopenharmony_ci# alternatives are given as parameters to the function 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_cidefault_parser_list = ["xml.sax.expatreader"] 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci# tell modulefinder that importing sax potentially imports expatreader 567db96d56Sopenharmony_ci_false = 0 577db96d56Sopenharmony_ciif _false: 587db96d56Sopenharmony_ci import xml.sax.expatreader 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ciimport os, sys 617db96d56Sopenharmony_ciif not sys.flags.ignore_environment and "PY_SAX_PARSER" in os.environ: 627db96d56Sopenharmony_ci default_parser_list = os.environ["PY_SAX_PARSER"].split(",") 637db96d56Sopenharmony_cidel os 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci_key = "python.xml.sax.parser" 667db96d56Sopenharmony_ciif sys.platform[:4] == "java" and sys.registry.containsKey(_key): 677db96d56Sopenharmony_ci default_parser_list = sys.registry.getProperty(_key).split(",") 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_cidef make_parser(parser_list=()): 717db96d56Sopenharmony_ci """Creates and returns a SAX parser. 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci Creates the first parser it is able to instantiate of the ones 747db96d56Sopenharmony_ci given in the iterable created by chaining parser_list and 757db96d56Sopenharmony_ci default_parser_list. The iterables must contain the names of Python 767db96d56Sopenharmony_ci modules containing both a SAX parser and a create_parser function.""" 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci for parser_name in list(parser_list) + default_parser_list: 797db96d56Sopenharmony_ci try: 807db96d56Sopenharmony_ci return _create_parser(parser_name) 817db96d56Sopenharmony_ci except ImportError: 827db96d56Sopenharmony_ci import sys 837db96d56Sopenharmony_ci if parser_name in sys.modules: 847db96d56Sopenharmony_ci # The parser module was found, but importing it 857db96d56Sopenharmony_ci # failed unexpectedly, pass this exception through 867db96d56Sopenharmony_ci raise 877db96d56Sopenharmony_ci except SAXReaderNotAvailable: 887db96d56Sopenharmony_ci # The parser module detected that it won't work properly, 897db96d56Sopenharmony_ci # so try the next one 907db96d56Sopenharmony_ci pass 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci raise SAXReaderNotAvailable("No parsers found", None) 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci# --- Internal utility methods used by make_parser 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ciif sys.platform[ : 4] == "java": 977db96d56Sopenharmony_ci def _create_parser(parser_name): 987db96d56Sopenharmony_ci from org.python.core import imp 997db96d56Sopenharmony_ci drv_module = imp.importName(parser_name, 0, globals()) 1007db96d56Sopenharmony_ci return drv_module.create_parser() 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_cielse: 1037db96d56Sopenharmony_ci def _create_parser(parser_name): 1047db96d56Sopenharmony_ci drv_module = __import__(parser_name,{},{},['create_parser']) 1057db96d56Sopenharmony_ci return drv_module.create_parser() 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_cidel sys 108