.. _bag_book/bag/from_to: 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 ```` e tutti dati della bag vengono racchiusi in un tag ```` +--------------------+---------------------+ | 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 Philip 1983-05-05 1.76 65 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 Philip 1983-05-05 1.76 65 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 3 - (int) weight: 65 .. sectionauthor:: Giovanni Porcari