XML

Abbiamo detto in precedenza che c’è una forte analogia tra Bag e la rappresentazione di dati come XML e che una Bag può essere instanziata piena a partire da una bag. Vediamo ora come si può serializzare una bag in XML con il metodo toXml. Questo metodo restituisce un testo XML completo che rispetta la codifica standard. Il frammento inizia quindi con <?xml version='1.0' encoding='UTF-8'?> e tutti dati della bag vengono racchiusi in un tag <GenRoBag>

Bag XML
label tag
value tag’s content
attributes attributes

Un’altra caratteristica che rende l’XML un modo molto efficace per serializzare una bag ed essere deserializzato in una bag è la tipizzazione dei dati.

>>> from gnr.core.gnrbag import Bag
>>> import datetime
>>> mybag= Bag()
>>> mybag.setItem('name','Philip')
>>> mybag['birthday']=datetime.date(1983,05,05)
>>> mybag['height']=1.76
>>> mybag['weight']=65

Ora se vediamo come viene serializzata in XML con l’attributo _T che viene aggiunto ai tag.

>>> mybag.toXml()
>>> print xml_source
<?xml version='1.0' encoding='UTF-8'?>
<GenRoBag><name>Philip</name>
<birthday _T="D">1983-05-05</birthday>
<height _T="R">1.76</height>
<weight _T="L">65</weight></GenRoBag>

Ecco le sigle con cui vengono rappresentati i tipi di dato nelle serializzazioni dei valori.

Codice Data type
T txt
R float
L int
B bool
BAG Bag
DT datetimehour
D datetime
H datetime.time

Ma non vengono conservati solo i tipi di dato dei valori, ma anche quelli degli attributi. Infatti ciascun attributo è seguito da “::type”. Se il tipo dell’attributo è string questo suffisso di tipizzazione non viene aggiunto.

>>> mybag.setAttr('height',lastMeasure=datetime.date(2010,11,17))
>>> xml_source = mybag.toXml()
>>> print xml_source
<GenRoBag><name>Philip</name>
<birthday _T="D">1983-05-05</birthday>
<height _T="R" lastMeasure="2010-11-17::D">1.76</height>
<weight _T="L">65</weight></GenRoBag>

Inoltre il metodo toXml può ricevere altri parametri opzionali. Di seguito riportiamo i più usati.

  • filename: ovvero il path su disco di dove verrà creato il file XML contenente la bag serializzata.Se questo parametro viene passato il metodo ritorna Nonee crea un file alla posizione corretta su disco.
  • encoding: imposta la codifica del file (il valore di default è UTF-8).

from XML

Come è stato detto nel capitolo sull’istanziazione delle bag, se passo al metodo costruttore un XML, la Bag viene creata contenente i dati. Se l’XML è tipizzato secondo la sintassi della bag, con l’attributo _T o con il suffisso ::Type negli attributi, allora la bag rispetterà i tipi.

>>> xmlbag = Bag(xml_source)
>>> print xmlbag
0 - (unicode) name: Philip
1 - (date) birthday: 1983-05-05
2 - (float) height: 1.76  <lastMeasure='2010-11-17'>
3 - (int) weight: 65