"""Implementation of the DOM Level 3 'LS-Load' feature."""import copyimport warningsimport xml.domfrom xml.dom.NodeFilter import NodeFilter__all__ = ["DOMBuilder", "DOMEntityResolver", "DOMInputSource"]class Options:"""Features object that has variables set for each DOMBuilder feature.The DOMBuilder class uses an instance of this class to pass settings tothe ExpatBuilder class."""# Note that the DOMBuilder class in LoadSave constrains which of these# values can be set using the DOM Level 3 LoadSave feature.namespaces = 1namespace_declarations = Truevalidation = Falseexternal_parameter_entities = Trueexternal_general_entities = Trueexternal_dtd_subset = Truevalidate_if_schema = Falsevalidate = Falsedatatype_normalization = Falsecreate_entity_ref_nodes = Trueentities = Truewhitespace_in_element_content = Truecdata_sections = Truecomments = Truecharset_overrides_xml_encoding = Trueinfoset = Falsesupported_mediatypes_only = FalseerrorHandler = Nonefilter = Noneclass DOMBuilder:entityResolver = NoneerrorHandler = Nonefilter = NoneACTION_REPLACE = 1ACTION_APPEND_AS_CHILDREN = 2ACTION_INSERT_AFTER = 3ACTION_INSERT_BEFORE = 4_legal_actions = (ACTION_REPLACE, ACTION_APPEND_AS_CHILDREN,ACTION_INSERT_AFTER, ACTION_INSERT_BEFORE)def __init__(self):self._options = Options()def _get_entityResolver(self):return self.entityResolverdef _set_entityResolver(self, entityResolver):self.entityResolver = entityResolverdef _get_errorHandler(self):return self.errorHandlerdef _set_errorHandler(self, errorHandler):self.errorHandler = errorHandlerdef _get_filter(self):return self.filterdef _set_filter(self, filter):self.filter = filterdef setFeature(self, name, state):if self.supportsFeature(name):state = state and 1 or 0try:settings = self._settings[(_name_xform(name), state)]except KeyError:raise xml.dom.NotSupportedErr("unsupported feature: %r" % (name,)) from Noneelse:for name, value in settings:setattr(self._options, name, value)else:raise xml.dom.NotFoundErr("unknown feature: " + repr(name))def supportsFeature(self, name):return hasattr(self._options, _name_xform(name))def canSetFeature(self, name, state):key = (_name_xform(name), state and 1 or 0)return key in self._settings# This dictionary maps from (feature,value) to a list of# (option,value) pairs that should be set on the Options object.# If a (feature,value) setting is not in this dictionary, it is# not supported by the DOMBuilder.#_settings = {("namespace_declarations", 0): [("namespace_declarations", 0)],("namespace_declarations", 1): [("namespace_declarations", 1)],("validation", 0): [("validation", 0)],("external_general_entities", 0): [("external_general_entities", 0)],("external_general_entities", 1): [("external_general_entities", 1)],("external_parameter_entities", 0): [("external_parameter_entities", 0)],("external_parameter_entities", 1): [("external_parameter_entities", 1)],("validate_if_schema", 0): [("validate_if_schema", 0)],("create_entity_ref_nodes", 0): [("create_entity_ref_nodes", 0)],("create_entity_ref_nodes", 1): [("create_entity_ref_nodes", 1)],("entities", 0): [("create_entity_ref_nodes", 0),("entities", 0)],("entities", 1): [("entities", 1)],("whitespace_in_element_content", 0): [("whitespace_in_element_content", 0)],("whitespace_in_element_content", 1): [("whitespace_in_element_content", 1)],("cdata_sections", 0): [("cdata_sections", 0)],("cdata_sections", 1): [("cdata_sections", 1)],("comments", 0): [("comments", 0)],("comments", 1): [("comments", 1)],("charset_overrides_xml_encoding", 0): [("charset_overrides_xml_encoding", 0)],("charset_overrides_xml_encoding", 1): [("charset_overrides_xml_encoding", 1)],("infoset", 0): [],("infoset", 1): [("namespace_declarations", 0),("validate_if_schema", 0),("create_entity_ref_nodes", 0),("entities", 0),("cdata_sections", 0),("datatype_normalization", 1),("whitespace_in_element_content", 1),("comments", 1),("charset_overrides_xml_encoding", 1)],("supported_mediatypes_only", 0): [("supported_mediatypes_only", 0)],("namespaces", 0): [("namespaces", 0)],("namespaces", 1): [("namespaces", 1)],}def getFeature(self, name):xname = _name_xform(name)try:return getattr(self._options, xname)except AttributeError:if name == "infoset":options = self._optionsreturn (options.datatype_normalizationand options.whitespace_in_element_contentand options.commentsand options.charset_overrides_xml_encodingand not (options.namespace_declarationsor options.validate_if_schemaor options.create_entity_ref_nodesor options.entitiesor options.cdata_sections))raise xml.dom.NotFoundErr("feature %s not known" % repr(name))def parseURI(self, uri):if self.entityResolver:input = self.entityResolver.resolveEntity(None, uri)else:input = DOMEntityResolver().resolveEntity(None, uri)return self.parse(input)def parse(self, input):options = copy.copy(self._options)options.filter = self.filteroptions.errorHandler = self.errorHandlerfp = input.byteStreamif fp is None and options.systemId:import urllib.requestfp = urllib.request.urlopen(input.systemId)return self._parse_bytestream(fp, options)def parseWithContext(self, input, cnode, action):if action not in self._legal_actions:raise ValueError("not a legal action")raise NotImplementedError("Haven't written this yet...")def _parse_bytestream(self, stream, options):import xml.dom.expatbuilderbuilder = xml.dom.expatbuilder.makeBuilder(options)return builder.parseFile(stream)def _name_xform(name):return name.lower().replace('-', '_')class DOMEntityResolver(object):__slots__ = '_opener',def resolveEntity(self, publicId, systemId):assert systemId is not Nonesource = DOMInputSource()source.publicId = publicIdsource.systemId = systemIdsource.byteStream = self._get_opener().open(systemId)# determine the encoding if the transport provided itsource.encoding = self._guess_media_encoding(source)# determine the base URI is we canimport posixpath, urllib.parseparts = urllib.parse.urlparse(systemId)scheme, netloc, path, params, query, fragment = parts# XXX should we check the scheme here as well?if path and not path.endswith("/"):path = posixpath.dirname(path) + "/"parts = scheme, netloc, path, params, query, fragmentsource.baseURI = urllib.parse.urlunparse(parts)return sourcedef _get_opener(self):try:return self._openerexcept AttributeError:self._opener = self._create_opener()return self._openerdef _create_opener(self):import urllib.requestreturn urllib.request.build_opener()def _guess_media_encoding(self, source):info = source.byteStream.info()if "Content-Type" in info:for param in info.getplist():if param.startswith("charset="):return param.split("=", 1)[1].lower()class DOMInputSource(object):__slots__ = ('byteStream', 'characterStream', 'stringData','encoding', 'publicId', 'systemId', 'baseURI')def __init__(self):self.byteStream = Noneself.characterStream = Noneself.stringData = Noneself.encoding = Noneself.publicId = Noneself.systemId = Noneself.baseURI = Nonedef _get_byteStream(self):return self.byteStreamdef _set_byteStream(self, byteStream):self.byteStream = byteStreamdef _get_characterStream(self):return self.characterStreamdef _set_characterStream(self, characterStream):self.characterStream = characterStreamdef _get_stringData(self):return self.stringDatadef _set_stringData(self, data):self.stringData = datadef _get_encoding(self):return self.encodingdef _set_encoding(self, encoding):self.encoding = encodingdef _get_publicId(self):return self.publicIddef _set_publicId(self, publicId):self.publicId = publicIddef _get_systemId(self):return self.systemIddef _set_systemId(self, systemId):self.systemId = systemIddef _get_baseURI(self):return self.baseURIdef _set_baseURI(self, uri):self.baseURI = uriclass DOMBuilderFilter:"""Element filter which can be used to tailor construction ofa DOM instance."""# There's really no need for this class; concrete implementations# should just implement the endElement() and startElement()# methods as appropriate. Using this makes it easy to only# implement one of them.FILTER_ACCEPT = 1FILTER_REJECT = 2FILTER_SKIP = 3FILTER_INTERRUPT = 4whatToShow = NodeFilter.SHOW_ALLdef _get_whatToShow(self):return self.whatToShowdef acceptNode(self, element):return self.FILTER_ACCEPTdef startContainer(self, element):return self.FILTER_ACCEPTdel NodeFilterclass DocumentLS:"""Mixin to create documents that conform to the load/save spec."""async_ = Falsedef _get_async(self):return Falsedef _set_async(self, flag):if flag:raise xml.dom.NotSupportedErr("asynchronous document loading is not supported")def abort(self):# What does it mean to "clear" a document? Does the# documentElement disappear?raise NotImplementedError("haven't figured out what this means yet")def load(self, uri):raise NotImplementedError("haven't written this yet")def loadXML(self, source):raise NotImplementedError("haven't written this yet")def saveXML(self, snode):if snode is None:snode = selfelif snode.ownerDocument is not self:raise xml.dom.WrongDocumentErr()return snode.toxml()class DOMImplementationLS:MODE_SYNCHRONOUS = 1MODE_ASYNCHRONOUS = 2def createDOMBuilder(self, mode, schemaType):if schemaType is not None:raise xml.dom.NotSupportedErr("schemaType not yet supported")if mode == self.MODE_SYNCHRONOUS:return DOMBuilder()if mode == self.MODE_ASYNCHRONOUS:raise xml.dom.NotSupportedErr("asynchronous builders are not supported")raise ValueError("unknown value for mode")def createDOMWriter(self):raise NotImplementedError("the writer interface hasn't been written yet!")def createDOMInputSource(self):return DOMInputSource()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。