LeenO computo metrico con LibreOffice  3.22.0
Il software libero per la gestione di computi metrici e contabilità lavori.
LeenoImport_XmlVeneto.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  # ~desc = root.items()[1][1]
48  titolo = root.get('desc') #+ ' - ' + root.get('ver')
49  # ~articoli = contenuto.findall('Articolo')
50 
51  # ~desc = settore.attrib['desc']
52  artList = {}
53  superCatList = {}
54  catList = {}
55 
56  settori = root.findall('settore')
57  for settore in settori:
58  # estrae supercategoria e categoria
59  codiceSuperCat = settore.attrib['cod']
60  superCat = settore.attrib['desc']
61 
62  if not codiceSuperCat in superCatList:
63  superCatList[codiceSuperCat] = superCat
64 
65  capitoli = settore.findall('capitolo')
66  for capitolo in capitoli:
67  codiceCat = capitolo.attrib['cod']
68  Cat = capitolo.attrib['desc']
69 
70  if not codiceCat in catList:
71  catList[codiceCat] = Cat
72 
73  paragrafi = capitolo.findall('paragrafo')
74  for paragrafo in paragrafi:
75  codiceCat = paragrafo.attrib['cod']
76  # ~Cat = paragrafo.attrib['desc']
77  if not codiceCat in catList:
78  catList[codiceCat] = paragrafo.find('sint').text
79  voce = paragrafo.find('estesa').text
80  try:
81  paragrafo.find('tipologia').text
82  if paragrafo.find('tipologia').text == 'Manodopera':
83  mdo = 1
84  else:
85  mdo = ''
86  except:
87  mdo = ''
88  prezzi = paragrafo.findall('prezzi')
89  for el in prezzi[0]:
90  art = el.text
91  if voce == None: voce = ''
92  if voce in art:
93  desc = art
94  else:
95  desc = voce + '\n- ' + art
96 
97  # un po' di pulizia nel testo
98  desc = desc.replace('\t', ' ').replace('è', 'è'
99  ).replace('°', '°').replace('Ã', 'à').replace(
100  ' $', '').replace('#13;', ' ').replace('\n \n', '\n')
101  while ' ' in desc:
102  desc = desc.replace(' ', ' ')
103  while '\n\n' in desc:
104  desc = desc.replace('\n\n', '\n')
105 
106 
107  codice = el.attrib['cod']
108  um = el.attrib['umi']
109  prezzo = float(el.attrib['val'])
110  if mdo == '':
111  try:
112  mdo = float(el.attrib['man']) / 100
113  except:
114  pass
115  # ~oneriSic = float(el.attrib['sicurezza'])
116 
117  # compone l'articolo e lo mette in lista
118  artList[codice] = {
119  'codice': codice,
120  'desc': desc,
121  'um': um,
122  'prezzo': prezzo,
123  'mdo': mdo,
124  'sicurezza': ''
125  }
126 
127 
128  # ritorna un dizionario contenente tutto il necessario
129  # per costruire l'elenco prezzi
130  return {
131  'titolo': titolo,
132  'superCategorie': superCatList,
133  'categorie': catList,
134  'articoli' : artList
135  }
LeenoImport_XmlVeneto.parseXML
def parseXML(data, defaultTitle=None)
Definition: LeenoImport_XmlVeneto.py:8
LeenoImport.stripXMLNamespaces
def stripXMLNamespaces(data)
Definition: LeenoImport.py:47