LeenO computo metrico con LibreOffice  3.22.0
Il software libero per la gestione di computi metrici e contabilità lavori.
LeenoImport_XmlLiguria.py
Vai alla documentazione di questo file.
1 import LeenoImport
2 import xml.etree.ElementTree as ET
3 
4 
5 # ~from com.sun.star.sheet.CellFlags import \
6  # ~VALUE, DATETIME, STRING, ANNOTATION, FORMULA, HARDATTR, OBJECTS, EDITATTR, FORMATTED
7 
8 def parseXML(data, defaultTitle=None):
9  '''
10  estrae dal file XML i dati dell'elenco prezzi
11  I dati estratti avranno il formato seguente:
12 
13  articolo = {
14  'codice': codice,
15  'desc': desc,
16  'um': um,
17  'prezzo': prezzo,
18  'mdo': mdo,
19  'sicurezza': oneriSic
20  }
21  artList = { codice : articolo, ... }
22 
23  superCatList = { codice : descrizione, ... }
24  catList = { codice : descrizione, ... }
25 
26  dati = {
27  'titolo': titolo,
28  'superCategorie': superCatList,
29  'categorie': catList,
30  'articoli' : artList
31  }
32  '''
33  # alcuni files sono degli XML-SIX con un bug
34  # consistente nella mancata dichiarazione del namespace
35  # quindi lo aggiungiamo a manina nei dati
36 
37  # ~ if data.find("xmlns=") < 0:
38  # ~ pattern = "<PRT:Prezzario>"
39  # ~ pos = data.find(pattern) + len(pattern) - 1
40  # ~ data = data[:pos] + ' xmlns:PRT="mynamespace"' + data[pos:]
41  # ~ print(data[:1000])
42 
43  # elimina i namespaces dai dati ed ottiene
44  # elemento radice dell' albero XML
46 
47  intestazione = root.find('intestazione')
48  autore = intestazione.attrib['autore']
49  # versione = intestazione.attrib['versione']
50 
51  dettaglio = intestazione.find('dettaglio')
52  anno = dettaglio.attrib['anno']
53  area = dettaglio.attrib['area']
54 
55  copyright = intestazione.find('copyright')
56  ccType = copyright.attrib['tipo']
57  ccDesc = copyright.attrib['descrizione']
58 
59  # crea il titolo dell' EP
60  # ~titolo = "Elenco prezzi - " + autore + " - " + area + " - anno " + anno
61  titolo = "Elenco prezzi - " + area + " - anno " + anno + "\n"\
62  + "Copyright: " + ccType + " - " + ccDesc
63 
64  contenuto = root.find('Contenuto')
65  articoli = contenuto.findall('Articolo')
66 
67  artList = {}
68  superCatList = {}
69  catList = {}
70 
71  for articolo in articoli:
72  codice = articolo.attrib['codice']
73 
74  # divide il codice per ottenere i codici di supercategoria e categoria
75  codiceSplit = codice.split('.')
76  codiceSuperCat = codiceSplit[0]
77  codiceCat = codiceSuperCat + '.' + codiceSplit[1]
78 
79  # estrae supercategoria e categoria
80  superCat = articolo.find('tipo').text
81  cat = articolo.find('capitolo').text
82 
83  # li inserisce se necessario nelle liste
84  if not codiceSuperCat in superCatList:
85  superCatList[codiceSuperCat] = superCat
86  if not codiceCat in catList:
87  catList[codiceCat] = cat
88 
89  voce = articolo.find('voce').text
90  if voce is None:
91  voce = ''
92  art = articolo.find('articolo').text
93  if art is None:
94  art = ''
95  desc = voce + '\n- ' + art
96 
97  # un po' di pulizia nel testo
98  desc = desc.replace('\t', ' ').replace('è', 'è').replace(
99  '°', '°').replace('Ã', 'à').replace(' $', '')
100  while ' ' in desc:
101  desc = desc.replace(' ', ' ')
102  while '\n\n' in desc:
103  desc = desc.replace('\n\n', '\n')
104 
105  um = articolo.find('um').text.split('(')[-1][: -1]
106  prezzo = articolo.find('prezzo').attrib['valore']
107 
108  # in 'sto benedetto prezzario ci sono numeri (grandi) con un punto
109  # per separare le migliaia OLTRE al punto per separare i decimali
110  # quindi... se trovo più di un punto decimale, devo eliminare i primi
111  if prezzo is not None:
112  if '.' not in prezzo:
113  prezzo = prezzo + '.0'
114  prSplit = prezzo.split('.')
115  prezzo = ''
116  for p in prSplit[0:-1]:
117  prezzo += p
118  prezzo += '.' + prSplit[-1]
119  prezzo = float(prezzo)
120  mdo = float(articolo.find('mo').text) / 100
121  oneriSic = float(articolo.find('sicurezza').text)
122 
123  # compone l'articolo e lo mette in lista
124  artList[codice] = {
125  'codice': codice,
126  'desc': desc,
127  'um': um,
128  'prezzo': prezzo,
129  'mdo': mdo,
130  'sicurezza': oneriSic
131  }
132 
133  # ritorna un dizionario contenente tutto il necessario
134  # per costruire l'elenco prezzi
135  return {
136  'titolo': titolo,
137  'superCategorie': superCatList,
138  'categorie': catList,
139  'articoli' : artList
140  }
LeenoImport_XmlLiguria.parseXML
def parseXML(data, defaultTitle=None)
Definition: LeenoImport_XmlLiguria.py:8
LeenoImport.stripXMLNamespaces
def stripXMLNamespaces(data)
Definition: LeenoImport.py:47