def process_context(self, context: Iterable) -> Any: """Iterate context and push the events to main parser.""" obj = None for event, element in context: if event == EventType.START: self.parser.start( self.clazz, self.queue, self.objects, element.tag, element.attrib, element.nsmap, ) elif event == EventType.END: obj = self.parser.end( self.queue, self.objects, element.tag, element.text, element.tail, ) element.clear() elif event == EventType.START_NS: prefix, uri = element self.parser.start_prefix_mapping(prefix, uri) else: raise XmlHandlerError(f"Unhandled event: `{event}`.") return obj
def parse(self, source: Any) -> Any: """ Parse an XML document from a system identifier or an InputSource. :raises XmlHandlerError: If process xinclude config is enabled. """ if self.parser.config.process_xinclude: raise XmlHandlerError( f"{type(self).__name__} doesn't support xinclude elements.") return self.process_context(iterparse(source, EVENTS)) # nosec
def parse(self, source: List[Tuple]) -> Any: """Forward the pre-recorded events to the main parser.""" obj = None for event, *args in source: if event == EventType.START: self.parser.start(self.clazz, self.queue, self.objects, *args) elif event == EventType.END: obj = self.parser.end(self.queue, self.objects, *args) elif event == EventType.START_NS: self.parser.start_prefix_mapping(*args) else: raise XmlHandlerError(f"Unhandled event: `{event}`.") return obj
def parse(self, source: Any) -> Any: """ Parse an XML document from a system identifier or an InputSource. :raises XmlHandlerError: If process xinclude config is enabled. """ if self.parser.config.process_xinclude: raise XmlHandlerError( f"{type(self).__name__} doesn't support xinclude elements.") parser = sax.make_parser() # nosec parser.setFeature(sax.handler.feature_namespaces, True) parser.setContentHandler(self) parser.parse(source) return self.close()
def parse(self, source: Any) -> Any: """ Parse an XML document from a system identifier or an InputSource. The xml parser will ignore comments, recover from errors and clean duplicate namespace prefixes. """ if self.parser.config.process_xinclude: raise XmlHandlerError( f"{type(self).__name__} doesn't support xinclude elements.") parser = etree.XMLParser( target=self, recover=True, remove_comments=True, ns_clean=True, resolve_entities=False, no_network=True, ) return etree.parse(source, parser=parser) # nosec