XML dokumentide parsija

From ICO wiki
Jump to navigationJump to search

Skripti kirjeldus

Kasutajalt küsitakse esimeseks sisendiks XML dokumendi nimi või "*", juhul kui soovitakse kõikki kaustas olevaid XML dokumente töödelda. Seejärel kontrollitakse, et sisendiks antud dokumendi laiend oleks õige või pannakse massiivi kõikide kaustas olevate XML dokumentide nimed. Seejärel võetakse massiivist ükshaaval XML dokumendi nimed ning parsitakse, st võetakse XML dokumendist DataFile elementide vahel base64 kood, mis dekodeeritakse ning salvestatakse DataFile atribuutdi Filename järgi. Luuakse kaust/kaustad, hakatakse parsima, pärast vaadatakse mitu faili on kaustas ning kausta suurus

Skript

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Impordime vajalikud teegid
import os
import sys
import glob
import time
import base64
import xml.dom.minidom
from xml.dom.minidom import parse

# Loome vajalikud muutujad/massiivid
XMLDocument=""
XMLDocuments=list()

# Küsime kasutajalt faili nime või * juhul kui ta soovib töödelda kõikki kaustas olevaid faile
while (not os.path.exists(XMLDocument)):
    XMLDocument = raw_input("Sisesta XML dokumendi nimi või * juhul kui soovid töödelda kõikki kaustas olevaid XML dokumente: ")
    # Kui kasutaja sisestas "*" siis salvestatakse kõik samas kaustas olevate XML dokumentide nimed massiivi ning kaktestatakse while tsükkel
    if XMLDocument == "*":
        print "Kasutaja sisestas *"
        for files in glob.glob("*.xml"):
            XMLDocuments.append(files)
        break
    # Kontrollime, kas kasutaja sisestatud dokumendi nime laiend on ".xml"
    elif XMLDocument[-4:] != ".xml":
        print "Vale laiendiga nimi!"
    # Kui eelmistest kadalippidest läbitud kontrollime üle, kas dokument on olemas, et kuvada vastava sisuline teade
    elif not os.path.exists(XMLDocument):
        print "Faili ei eksisteeri!"
    # Juhul kui kasutaja sisestab ühe dokumendi lisame massiivi
    else:
        XMLDocuments.append(XMLDocument)

# Kõik massiivis olevad dokumendid töötleme läbi
for XMLDocumentName in XMLDocuments:
    print "Dokumendi", XMLDocumentName, "töötlemine"
    
    # Avame dokumendi
    XMLDocument = open(XMLDocumentName)
    # Loome dokumendi failidele kausta nimetuse
    dataFilesDir = XMLDocumentName[:-4]
    
    # Kontrollime, kas kaust on olemas, kui ei ole siis loome
    if not os.path.isdir(dataFilesDir):
        os.mkdir(dataFilesDir)
    
    # Käivitame kella, ehk anname muutujale hetke kellaaja
    seconds = time.time()
    # XML dokumendi parsimine
    XMLParsed = parse(XMLDocument)
    
    # Alustame failide salvestamisega dokumendist, kuvame infot kasutajale
    print "Dokumendi", XMLDocumentName, "failid salvestatakse kausta:", dataFilesDir
    # Iga DataFile elemendi kohta käivitatakse järgnev protsess
    for node in XMLParsed.getElementsByTagName("DataFile"):
        # Dokumendi faili nimeks anname elemendi atribuudi, mis tähistab faili nime
        dataFileName = node.getAttribute("Filename")
        # Võtame elemendi väärtusest base64 kodeeritud andmed
        dataFileData = node.childNodes[0].nodeValue
        # Valmistame ette faili täispika asukoha koos nimega
        dataFileDir = os.path.join(dataFilesDir,dataFileName)
        # Avame faili, luuakse uus fail
        fileObj = open(dataFileDir, "w")
        # Salvestame faili base64 dekodeeritud andmed
        fileObj.write(base64.b64decode(dataFileData))
        # Fail suletakse
        fileObj.close()
        #Trükime välja faili nime ja suuruse
        dataFileSize = os.path.getsize(dataFileDir)
        print dataFileName, "%0.3f KB" % float(dataFileSize/1024.0)
    
    # Loome/taasväärtustame muutujad
    dataFilesSize=0
    dataFilesCount=0
    folder_size = 0
    # Iga faili kohta kaustas toimub järgnev tegevus
    for (path, dirs, files) in os.walk(dataFilesDir):
        for file in files:
            # Tuletame faili täispika nime jälle
            dataFileName = os.path.join(path, file)
            # Liidame failide kogumahule faili mahu
            dataFilesSize += os.path.getsize(dataFileName)
            # Liidame faili loendurile ühe juurd
            dataFilesCount+=1
    # Trükime välja mitu faili kokku dokumendist kättesaadis ning kogumaht
    print "Kokku",dataFilesCount,"faili mahuga %0.3f KB" % float(dataFilesSize/1024.0)
    # Näitame kaua kulus töötlemisele aega, lõpp lahutatud algus=stopper
    seconds = time.time() - seconds
    print "XML faili töötluseks kulus %.3f sekundit" % seconds

Autor

--Marko Valing, AK31(2010) 10:42, 28 January 2011 (EET)