def load(odffile): from load import LoadParser from xml.sax import make_parser, handler z = zipfile.ZipFile(odffile) mimetype = z.read('mimetype') doc = OpenDocument(mimetype, add_generator=False) # Look in the manifest file to see if which of the four files there are manifestpart = z.read('META-INF/manifest.xml') manifest = manifestlist(manifestpart) for xmlfile in ('settings.xml', 'meta.xml', 'content.xml', 'styles.xml'): if not manifest.has_key(xmlfile): continue try: xmlpart = z.read(xmlfile) doc._parsing = xmlfile parser = make_parser() parser.setFeature(handler.feature_namespaces, 1) parser.setContentHandler(LoadParser(doc)) parser.setErrorHandler(handler.ErrorHandler()) inpsrc = InputSource() inpsrc.setByteStream(StringIO(xmlpart)) parser.parse(inpsrc) del doc._parsing except KeyError, v: pass
def __loadxmlparts(z, manifest, doc, objectpath): from load import LoadParser from xml.sax import make_parser, handler for xmlfile in (objectpath + 'settings.xml', objectpath + 'meta.xml', objectpath + 'content.xml', objectpath + 'styles.xml'): if xmlfile not in manifest: continue try: xmlpart = z.read(xmlfile) doc._parsing = xmlfile parser = make_parser() parser.setFeature(handler.feature_namespaces, 1) parser.setContentHandler(LoadParser(doc)) parser.setErrorHandler(handler.ErrorHandler()) inpsrc = InputSource() inpsrc.setByteStream(BytesIO(xmlpart)) parser.setFeature( handler.feature_external_ges, False) # Changed by Kovid to ignore external DTDs parser.parse(inpsrc) del doc._parsing except KeyError: pass
def __loadxmlparts(z, manifest, doc, objectpath): """ Parses a document from its zipfile @param z an instance of zipfile.ZipFile @param manifest Manifest data structured in a dictionary @param doc instance of OpenDocument to feed in @param objectpath unicode string: path to an object """ assert (isinstance(z, zipfile.ZipFile)) assert (type(manifest) == type(dict())) assert (isinstance(doc, OpenDocument)) assert (type(objectpath) == type(u"")) from load import LoadParser from xml.sax import make_parser, handler for xmlfile in (objectpath + u'settings.xml', objectpath + u'meta.xml', objectpath + u'content.xml', objectpath + u'styles.xml'): if xmlfile not in manifest: continue ########################################################## # this one is added to debug the bad behavior with Python2 # which raises exceptions of type SAXParseException from xml.sax._exceptions import SAXParseException ########################################################## try: xmlpart = z.read(xmlfile).decode("utf-8") doc._parsing = xmlfile parser = make_parser() parser.setFeature(handler.feature_namespaces, 1) parser.setFeature(handler.feature_external_ges, 0) parser.setContentHandler(LoadParser(doc)) parser.setErrorHandler(handler.ErrorHandler()) inpsrc = InputSource() ################# # There may be a SAXParseException triggered because of # a missing xmlns prefix like meta, config, etc. # So i add such declarations when needed (GK, 2014/10/21). # Is there any option to prevent xmlns checks by SAX? xmlpart = __fixXmlPart(xmlpart) inpsrc.setByteStream(BytesIO(xmlpart.encode("utf-8"))) parser.parse(inpsrc) del doc._parsing except KeyError as v: pass except SAXParseException: print(u"====== SAX FAILED TO PARSE ==========\n", xmlpart)
def __loadxmlparts(z, manifest, doc, objectpath): from load import LoadParser from xml.sax import make_parser, handler for xmlfile in (objectpath+'settings.xml', objectpath+'meta.xml', objectpath+'content.xml', objectpath+'styles.xml'): if not manifest.has_key(xmlfile): continue try: xmlpart = z.read(xmlfile) doc._parsing = xmlfile parser = make_parser() parser.setFeature(handler.feature_namespaces, 1) parser.setContentHandler(LoadParser(doc)) parser.setErrorHandler(handler.ErrorHandler()) inpsrc = InputSource() inpsrc.setByteStream(StringIO(xmlpart)) parser.parse(inpsrc) del doc._parsing except KeyError, v: pass