LeenO computo metrico con LibreOffice  3.22.0
Il software libero per la gestione di computi metrici e contabilità lavori.
LeenoImport_XmlBasilicata.py
Vai alla documentazione di questo file.
1 import LeenoImport
2 import xml.etree.ElementTree as ET
3 # ~import LeenoDialogs as DLG
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  titolo = root.find('pdf').text
48  if '.pdf' in titolo:
49  titolo = titolo[: -4]
50 
51  titolo = ' '.join(titolo.split('_'))
52 
53  artList = {}
54  superCatList = {}
55  catList = {}
56 
57  capitoli = root.find('capitoli') # è una sola ricorrenza
58 
59  for Capitolo in capitoli:
60 
61  # estrae supercategoria e categoria
62  codiceSuperCat = Capitolo.find('codice').text
63  superCat = Capitolo.find('descrizione').text.strip()
64 
65  if not codiceSuperCat in superCatList:
66  superCatList[codiceSuperCat] = superCat
67 
68  categorie = Capitolo.find('categorie')
69  for Categoria in categorie:
70  codiceCat = codiceSuperCat + '.' + Categoria.find('codice').text
71  Cat = Categoria.find('descrizione').text
72  if not codiceCat in catList:
73  catList[codiceCat] = Cat
74 
75  # estrae voci e sottovoci
76  voci = Categoria.find('voci')
77  for Voce in voci:
78  voce = Voce.find('descrizione').text
79  # ~hashcode = Voce.find('hashcode').text # il dato c'è, ma per ora non serve
80  Scodice = codiceCat + '.' + Voce.find('codice').text
81  sottovoci = Voce.find('sottovoci')
82  for Sottovoce in sottovoci:
83  codice = Scodice + '.' + Sottovoce.find('codice').text
84  try:
85  desc = voce + '\n- ' + Sottovoce.find('descrizione').text
86  except:
87  desc = voce
88  um = Sottovoce.find('unitaMisura').find('codice').text.strip()
89  prezzo = float(Sottovoce.find('prezzo').text)
90  mdo = float(Sottovoce.find('manodopera').text) / 100
91  if mdo ==0:
92  mdo = ''
93 
94  # un po' di pulizia nel testo
95  desc = desc.replace('\t', ' ').replace('è', 'è'
96  ).replace('°', '°').replace('Ã', 'à').replace(
97  ' $', '').replace('#13;', ' ').replace('\n \n', '\n')
98  while ' ' in desc:
99  desc = desc.replace(' ', ' ')
100  while '\n\n' in desc:
101  desc = desc.replace('\n\n', '\n')
102 
103  # compone l'articolo e lo mette in lista
104  artList[codice] = {
105  'codice': codice,
106  'desc': desc,
107  'um': um,
108  'prezzo': prezzo,
109  'mdo': mdo,
110  'sicurezza': ''
111  }
112 
113  # ritorna un dizionario contenente tutto il necessario
114  # per costruire l'elenco prezzi
115  return {
116  'titolo': titolo,
117  'superCategorie': superCatList,
118  'categorie': catList,
119  'articoli' : artList
120  }
LeenoImport_XmlBasilicata.parseXML
def parseXML(data, defaultTitle=None)
Definition: LeenoImport_XmlBasilicata.py:8
LeenoImport.stripXMLNamespaces
def stripXMLNamespaces(data)
Definition: LeenoImport.py:47