123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- 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()
|