|
|
|
|
|
|
|
|
|
|
|
|
| import os
|
| from defusedxml import sax as defused_sax
|
| from xml.sax.handler import ContentHandler
|
| import zipfile
|
|
|
|
|
|
|
| class DocumentHandler(ContentHandler):
|
| def __init__(self, dirname):
|
| super().__init__()
|
| self.files = []
|
| self.dirname = dirname
|
|
|
| def startElement(self, name, attributes):
|
| item = attributes.get("file")
|
| if item is not None:
|
| self.files.append(os.path.join(self.dirname, str(item)))
|
|
|
| def characters(self, data):
|
| return
|
|
|
| def endElement(self, name):
|
| return
|
|
|
|
|
| def extractDocument(filename, outpath):
|
| zfile = zipfile.ZipFile(filename)
|
| files = zfile.namelist()
|
|
|
| for i in files:
|
| data = zfile.read(i)
|
| dirs = i.split("/")
|
| if len(dirs) > 1:
|
| dirs.pop()
|
| curpath = outpath
|
| for j in dirs:
|
| curpath = curpath + "/" + j
|
| os.mkdir(curpath)
|
| output = open(outpath + "/" + i, "wb")
|
| output.write(data)
|
| output.close()
|
|
|
|
|
| def createDocument(filename, outpath):
|
| files = getFilesList(filename)
|
| compress = zipfile.ZipFile(outpath, "w", zipfile.ZIP_DEFLATED)
|
| for i in files:
|
| dirs = os.path.split(i)
|
|
|
| compress.write(i, dirs[-1], zipfile.ZIP_DEFLATED)
|
| compress.close()
|
|
|
|
|
| def getFilesList(filename):
|
| dirname = os.path.dirname(filename)
|
| handler = DocumentHandler(dirname)
|
| parser = defused_sax.make_parser()
|
| parser.setContentHandler(handler)
|
| parser.parse(filename)
|
|
|
| files = []
|
| files.append(filename)
|
| files.extend(iter(handler.files))
|
| dirname = os.path.join(dirname, "GuiDocument.xml")
|
| if os.path.exists(dirname):
|
| files.append(dirname)
|
| return files
|
|
|