"""SAX driver for the pyexpat C module. This driver works withpyexpat.__version__ == '2.22'."""version = "0.20"from xml.sax._exceptions import *from xml.sax.handler import feature_validation, feature_namespacesfrom xml.sax.handler import feature_namespace_prefixesfrom xml.sax.handler import feature_external_ges, feature_external_pesfrom xml.sax.handler import feature_string_interningfrom xml.sax.handler import property_xml_string, property_interning_dict# xml.parsers.expat does not raise ImportError in Jythonimport sysif sys.platform[:4] == "java":raise SAXReaderNotAvailable("expat not available in Java", None)del systry:from xml.parsers import expatexcept ImportError:raise SAXReaderNotAvailable("expat not supported", None)else:if not hasattr(expat, "ParserCreate"):raise SAXReaderNotAvailable("expat not supported", None)from xml.sax import xmlreader, saxutils, handlerAttributesImpl = xmlreader.AttributesImplAttributesNSImpl = xmlreader.AttributesNSImpl# If we're using a sufficiently recent version of Python, we can use# weak references to avoid cycles between the parser and content# handler, otherwise we'll just have to pretend.try:import _weakrefexcept ImportError:def _mkproxy(o):return oelse:import weakref_mkproxy = weakref.proxydel weakref, _weakrefclass _ClosedParser:pass# --- ExpatLocatorclass ExpatLocator(xmlreader.Locator):"""Locator for use with the ExpatParser class.This uses a weak reference to the parser object to avoid creatinga circular reference between the parser and the content handler."""def __init__(self, parser):self._ref = _mkproxy(parser)def getColumnNumber(self):parser = self._refif parser._parser is None:return Nonereturn parser._parser.ErrorColumnNumberdef getLineNumber(self):parser = self._refif parser._parser is None:return 1return parser._parser.ErrorLineNumberdef getPublicId(self):parser = self._refif parser is None:return Nonereturn parser._source.getPublicId()def getSystemId(self):parser = self._refif parser is None:return Nonereturn parser._source.getSystemId()# --- ExpatParserclass ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):"""SAX driver for the pyexpat C module."""def __init__(self, namespaceHandling=0, bufsize=2**16-20):xmlreader.IncrementalParser.__init__(self, bufsize)self._source = xmlreader.InputSource()self._parser = Noneself._namespaces = namespaceHandlingself._lex_handler_prop = Noneself._parsing = 0self._entity_stack = []self._external_ges = 0self._interning = None# XMLReader methodsdef parse(self, source):"Parse an XML document from a URL or an InputSource."source = saxutils.prepare_input_source(source)self._source = sourcetry:self.reset()self._cont_handler.setDocumentLocator(ExpatLocator(self))xmlreader.IncrementalParser.parse(self, source)except:# bpo-30264: Close the source on error to not leak resources:# xml.sax.parse() doesn't give access to the underlying parser# to the callerself._close_source()raisedef prepareParser(self, source):if source.getSystemId() is not None:self._parser.SetBase(source.getSystemId())# Redefined setContentHandler to allow changing handlers during parsingdef setContentHandler(self, handler):xmlreader.IncrementalParser.setContentHandler(self, handler)if self._parsing:self._reset_cont_handler()def getFeature(self, name):if name == feature_namespaces:return self._namespaceselif name == feature_string_interning:return self._interning is not Noneelif name in (feature_validation, feature_external_pes,feature_namespace_prefixes):return 0elif name == feature_external_ges:return self._external_gesraise SAXNotRecognizedException("Feature '%s' not recognized" % name)def setFeature(self, name, state):if self._parsing:raise SAXNotSupportedException("Cannot set features while parsing")if name == feature_namespaces:self._namespaces = stateelif name == feature_external_ges:self._external_ges = stateelif name == feature_string_interning:if state:if self._interning is None:self._interning = {}else:self._interning = Noneelif name == feature_validation:if state:raise SAXNotSupportedException("expat does not support validation")elif name == feature_external_pes:if state:raise SAXNotSupportedException("expat does not read external parameter entities")elif name == feature_namespace_prefixes:if state:raise SAXNotSupportedException("expat does not report namespace prefixes")else:raise SAXNotRecognizedException("Feature '%s' not recognized" % name)def getProperty(self, name):if name == handler.property_lexical_handler:return self._lex_handler_propelif name == property_interning_dict:return self._interningelif name == property_xml_string:if self._parser:if hasattr(self._parser, "GetInputContext"):return self._parser.GetInputContext()else:raise SAXNotRecognizedException("This version of expat does not support getting"" the XML string")else:raise SAXNotSupportedException("XML string cannot be returned when not parsing")raise SAXNotRecognizedException("Property '%s' not recognized" % name)def setProperty(self, name, value):if name == handler.property_lexical_handler:self._lex_handler_prop = valueif self._parsing:self._reset_lex_handler_prop()elif name == property_interning_dict:self._interning = valueelif name == property_xml_string:raise SAXNotSupportedException("Property '%s' cannot be set" %name)else:raise SAXNotRecognizedException("Property '%s' not recognized" %name)# IncrementalParser methodsdef feed(self, data, isFinal = 0):if not self._parsing:self.reset()self._parsing = 1self._cont_handler.startDocument()try:# The isFinal parameter is internal to the expat reader.# If it is set to true, expat will check validity of the entire# document. When feeding chunks, they are not normally final -# except when invoked from close.self._parser.Parse(data, isFinal)except expat.error as e:exc = SAXParseException(expat.ErrorString(e.code), e, self)# FIXME: when to invoke error()?self._err_handler.fatalError(exc)def _close_source(self):source = self._sourcetry:file = source.getCharacterStream()if file is not None:file.close()finally:file = source.getByteStream()if file is not None:file.close()def close(self):if (self._entity_stack or self._parser is None orisinstance(self._parser, _ClosedParser)):# If we are completing an external entity, do nothing herereturntry:self.feed("", isFinal = 1)self._cont_handler.endDocument()self._parsing = 0# break cycle created by expat handlers pointing to our methodsself._parser = Nonefinally:self._parsing = 0if self._parser is not None:# Keep ErrorColumnNumber and ErrorLineNumber after closing.parser = _ClosedParser()parser.ErrorColumnNumber = self._parser.ErrorColumnNumberparser.ErrorLineNumber = self._parser.ErrorLineNumberself._parser = parserself._close_source()def _reset_cont_handler(self):self._parser.ProcessingInstructionHandler = \self._cont_handler.processingInstructionself._parser.CharacterDataHandler = self._cont_handler.charactersdef _reset_lex_handler_prop(self):lex = self._lex_handler_propparser = self._parserif lex is None:parser.CommentHandler = Noneparser.StartCdataSectionHandler = Noneparser.EndCdataSectionHandler = Noneparser.StartDoctypeDeclHandler = Noneparser.EndDoctypeDeclHandler = Noneelse:parser.CommentHandler = lex.commentparser.StartCdataSectionHandler = lex.startCDATAparser.EndCdataSectionHandler = lex.endCDATAparser.StartDoctypeDeclHandler = self.start_doctype_declparser.EndDoctypeDeclHandler = lex.endDTDdef reset(self):if self._namespaces:self._parser = expat.ParserCreate(self._source.getEncoding(), " ",intern=self._interning)self._parser.namespace_prefixes = 1self._parser.StartElementHandler = self.start_element_nsself._parser.EndElementHandler = self.end_element_nselse:self._parser = expat.ParserCreate(self._source.getEncoding(),intern = self._interning)self._parser.StartElementHandler = self.start_elementself._parser.EndElementHandler = self.end_elementself._reset_cont_handler()self._parser.UnparsedEntityDeclHandler = self.unparsed_entity_declself._parser.NotationDeclHandler = self.notation_declself._parser.StartNamespaceDeclHandler = self.start_namespace_declself._parser.EndNamespaceDeclHandler = self.end_namespace_declself._decl_handler_prop = Noneif self._lex_handler_prop:self._reset_lex_handler_prop()# self._parser.DefaultHandler =# self._parser.DefaultHandlerExpand =# self._parser.NotStandaloneHandler =self._parser.ExternalEntityRefHandler = self.external_entity_reftry:self._parser.SkippedEntityHandler = self.skipped_entity_handlerexcept AttributeError:# This pyexpat does not support SkippedEntitypassself._parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)self._parsing = 0self._entity_stack = []# Locator methodsdef getColumnNumber(self):if self._parser is None:return Nonereturn self._parser.ErrorColumnNumberdef getLineNumber(self):if self._parser is None:return 1return self._parser.ErrorLineNumberdef getPublicId(self):return self._source.getPublicId()def getSystemId(self):return self._source.getSystemId()# event handlersdef start_element(self, name, attrs):self._cont_handler.startElement(name, AttributesImpl(attrs))def end_element(self, name):self._cont_handler.endElement(name)def start_element_ns(self, name, attrs):pair = name.split()if len(pair) == 1:# no namespacepair = (None, name)elif len(pair) == 3:pair = pair[0], pair[1]else:# default namespacepair = tuple(pair)newattrs = {}qnames = {}for (aname, value) in attrs.items():parts = aname.split()length = len(parts)if length == 1:# no namespaceqname = anameapair = (None, aname)elif length == 3:qname = "%s:%s" % (parts[2], parts[1])apair = parts[0], parts[1]else:# default namespaceqname = parts[1]apair = tuple(parts)newattrs[apair] = valueqnames[apair] = qnameself._cont_handler.startElementNS(pair, None,AttributesNSImpl(newattrs, qnames))def end_element_ns(self, name):pair = name.split()if len(pair) == 1:pair = (None, name)elif len(pair) == 3:pair = pair[0], pair[1]else:pair = tuple(pair)self._cont_handler.endElementNS(pair, None)# this is not used (call directly to ContentHandler)def processing_instruction(self, target, data):self._cont_handler.processingInstruction(target, data)# this is not used (call directly to ContentHandler)def character_data(self, data):self._cont_handler.characters(data)def start_namespace_decl(self, prefix, uri):self._cont_handler.startPrefixMapping(prefix, uri)def end_namespace_decl(self, prefix):self._cont_handler.endPrefixMapping(prefix)def start_doctype_decl(self, name, sysid, pubid, has_internal_subset):self._lex_handler_prop.startDTD(name, pubid, sysid)def unparsed_entity_decl(self, name, base, sysid, pubid, notation_name):self._dtd_handler.unparsedEntityDecl(name, pubid, sysid, notation_name)def notation_decl(self, name, base, sysid, pubid):self._dtd_handler.notationDecl(name, pubid, sysid)def external_entity_ref(self, context, base, sysid, pubid):if not self._external_ges:return 1source = self._ent_handler.resolveEntity(pubid, sysid)source = saxutils.prepare_input_source(source,self._source.getSystemId() or"")self._entity_stack.append((self._parser, self._source))self._parser = self._parser.ExternalEntityParserCreate(context)self._source = sourcetry:xmlreader.IncrementalParser.parse(self, source)except:return 0 # FIXME: save error info here?(self._parser, self._source) = self._entity_stack[-1]del self._entity_stack[-1]return 1def skipped_entity_handler(self, name, is_pe):if is_pe:# The SAX spec requires to report skipped PEs with a '%'name = '%'+nameself._cont_handler.skippedEntity(name)# ---def create_parser(*args, **kwargs):return ExpatParser(*args, **kwargs)# ---if __name__ == "__main__":import xml.sax.saxutilsp = create_parser()p.setContentHandler(xml.sax.saxutils.XMLGenerator())p.setErrorHandler(xml.sax.ErrorHandler())p.parse("http://www.ibiblio.org/xml/examples/shakespeare/hamlet.xml")
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。