import xml.etree.ElementTree as Xet import os import csv #Passo al parser i file xml xml_file_name = '/Users/federicaspinelli/Google Drive/OVI-CNR/XML/XML SCHEDE OA/000-Opere_Gall.Martini/AR20AUT.xml' tree = Xet.parse(xml_file_name) #Dichiaro l'elemento radice root = tree.getroot() #Dichiaro l'elemento che contiene tutte le risorse da processare. Sara' la base per costruire i path schede = root.find("schede") #Dichiaro la lista degli elementi da processare schedeM = root.findall("schede/scheda") xmlparseO = Xet.parse('/Users/federicaspinelli/Google Drive/OVI-CNR/XML/XML SCHEDE OA/000-Opere_Comm.Ospedale/AR20AUT.xml') rootO = xmlparseO.getroot() schedeO = rootO.findall("schede/scheda") xmlparseF = Xet.parse('/Users/federicaspinelli/Google Drive/OVI-CNR/XML/XML SCHEDE OA/000-Opere_Datini/AR20AUT.xml') rootF = xmlparseF.getroot() schedeF = rootF.findall("schede/scheda") # Comincio a scrivere il file csv BIB_data = open('BIB_Data.csv', 'w') csvwriter = csv.writer(BIB_data) list_path = [] #Questa funzione ricostruisce i path dei nodi def iterate(node, path=""): aut = [] if path: current_path = path + "/" + node.tag else: current_path = node.tag path = current_path for child in node: iterate(child, path=current_path) obj = cell(path) aut.append(obj) def cell(path): nd = root.find(path) res = nd.text tag = nd.tag #Dato che ho memorizzato tutti i path a partire da root elimino la parte del path che e' già dichiarata per il mio oggetto new_path = path.replace('schede/scheda/', '') #Elimino i caratteri non convenzionali dalle stringhe. #Operazione necessaria per non avere celle con \n\t, che in realta' sono celle vuote str = res.rstrip() #Se la stringa non è vuota memorrizzo nell'array tag e path corrspondenti if str != "": list_path.append([tag, new_path]) return str #Lancio la funziona iterate su schede per ottenere tutti i tag contenuti in schede con i percorsi associati iterate(schede) #Elimino i duplicati dall'array list_path e salvo un array params con i soli tag, mi servira' per costruire la prima riga del csv #array andra' a contenere tutti tag distinti con i relativi percorsi array = [] params = [] seen = set() for item in list_path: t = tuple(item) if t not in seen: params.append(item[0]) array.append(item) seen.add(t) #Scrivo la prima riga del csn con i nomi dei tag csvwriter.writerow(params) #Controllo che il valore trovato non sia nullo, cioe' quel tag non ha un valore associato. #In questo caso la cella deve essere vuota, quindi dichiaro un carattere vuoto #altrimenti dichiaro il testo associato all'elemento def check(val): if val is None: res = " " else: res = val.text return res #Costruisco ciascuna riga del csv def build_rows(schede): for scheda in schede: #gg è una riga del csv gg = [] #Per ogni elemento di array costruisco una cella della riga for x in range(len(array)): par = array[x][0] #Riprendo il path e dichiaro il valore associato path = array[x][1] value = scheda.find(path) #Faccio un controllo sul valore attraverso la funzione check r = check(value) #Appendo il valore all'array gg gg.append(r) #Scrivo la riga nel file csv csvwriter.writerow(gg) build_rows(schedeM) build_rows(schedeO) build_rows(schedeF) BIB_data.close()