• Non ci sono risultati.

La traduzione degli elementi, semplici e complessi, e delle definizioni di nuovi tipi di dato complesso rappresenta il cuore dell’intero processo di trasposizione; sono proprio le gerarchie formate dagli elementi innestati che formano la struttura por-tante di un documento Xml, ed `e proprio seguendo questa struttura che siamo in grado di ottenere l’informazione (il dato) che ci interessa. Abbiamo gi`a visto come un Xml-Schema fornisca una rappresentazione (vista) dettagliata dell’insieme di ele-menti componenti un documento Xml e quindi `e facile comprendere come una buona traduzione dei concetti di element e complexType rappresenti un’ottima base per tutto il lavoro.

Praticamente tutti gli esempi di schemi Xml che verranno utilizzati e tradotti in questo capitolo sono gi`a stati presentati e descritti durante la sezione riguardante la struttura di Xml-Schema.

La scelta che `e stata fatta `e quella di tradurre un elemento complesso come una classe ODLI3 interface derivante per ereditariet`a dall’interface che rappresenta il suo

tipo complesso di appartenenza. Sia dunque gli element complessi che le definizioni

complexType saranno tradotte come interface e per distinguere questi due costrutti

si `e deciso di aggiungere alla definizione dell’interface di un elemento complesso la dichiarazione extent seguita dal nome della classe stessa. In ODLI3, infatti, l’extent di una classe rappresenta la collezione di tutte le sue istanze e solamente gli oggetti

Figura 5.1: Schema della traduzione dei concetti pi`u importanti

e le classi possono avere istanze, non i tipi di dato. Un elemento avente un con-tenuto semplice e sprovvisto di sottoelementi `e, invece, tradotto come un attributo

at-tribute contenuto all’interno dell’interface che rappresenta il complexType in cui si

tro-va nell’Xml-Schema. Vediamo come possiamo quindi tradurre l’elemento Indirizzo appartenente al tipo complesso IndirizzoType:

< xsd:element name =”Indirizzo” type=”IndirizzoType”/>

<xsd:complexType name=”IndirizzoType”>

< xsd:element name =”Stato” type=”xsd: string ”/> < xsd:element name =”Citt`a ” type=”xsd: string ”/> < xsd:element name =”Via” type=”xsd: string ”/>

< xsd:element name=”Numero” type=”xsd:int”/> </xsd:complexType>

traduzione in ODLI3:

interface Indirizzo : IndirizzoType ( source semistructured Ordine.xml extent Indirizzo )

{};

interface IndirizzoType ( source semistructured Ordine.xml)

{

attribute string Stato ;

attribute string Citt`a ;

attribute string Via;

attribute int Numero;

};

Una traduzione di questo tipo pu`o in alcuni casi causare una perdita di infor-mazione: supponiamo, ad esempio, che l’elemento semplice Numero sia definito non come int ma come positiveInteger: la traduzione in ODLI3 sarebbe comunque la medesima, perdiamo quindi l’informazione del tipo di dato di base originario. Questo problema potrebbe essere ovviato tramite l’inserimento dell’informazione carente dal-l’interno del tipo di appartenenza dell’attribute.

interface IndirizzoType ( source semistructured Ordine.xml)

{

typedef string elem Stato string ; attribute elem Stato string Stato ;

typedef string elem Citt`a string ; attribute elem Citt`a string Citt`a ;

typedef string elem Via string ; attribute elem Via string Via;

typedef int elem Numero positiveInteger ; attribute elem Numero positiveInteger Numero;

};

in questo caso ogni elemento semplice `e tradotto come un attribute appartenente ad un tipo definito all’interno della classe medesima il cui nome esprime: il fatto che si stia trattando un elemento, il nome dell’elemento (per eliminare possibili duplicati) ed il tipo di dato originario di Xml-Schema. A parer mio la traduzione migliore rimane comunque la prima (senza i typedef ) poich in uno schema Xml `e possibile definire nuovi tipi di dato semplice (tradotti in ODLI3 anch’essi con il costrutto typedef ) e si potrebbe ottenere una traduzione decisamente troppo ridondante per un singolo elemento.

Un secondo metodo per evitare la perdita di informazione del tipo di dato semplice `e fornire, per ogni tipo di base non mappato direttamente in ODLI3 (come, ad esempio, string oppure int), la traduzione all’inizio dello schema nel corrispondente tipo ODLI3

tramite il costrutto typedef. Riprendiamo l’esempio appena trattato riguardante il tipo complesso IndirizzoType (e consideriamo che l’elemento semplice Numero contenuto al suo interno sia, ancora una volta, definito positiveInteger, e dunque non mappato direttamente in ODLI3):

<xsd:complexType name=”IndirizzoType”>

< xsd:element name =”Stato” type=”xsd: string ”/> < xsd:element name =”Citt`a ” type=”xsd: string ”/> < xsd:element name =”Via” type=”xsd: string ”/>

< xsd:element name=”Numero” type=”xsd:positiveInteger”/> </xsd:complexType>

una traduzione possibile `e, dunque:

... typedef int positiveInteger ; typedef int negativeInteger ; typedef string ID ; typedef string Date ; typedef string Name ; ...

interface IndirizzoType ( source semistructured Ordine.xml)

{

attribute string Citt`a ;

attribute string Via;

attribute positiveInteger Numero;

};

Le traduzioni, tramite typedef, dei tipi di base non mappati direttamente in ODLI3

seguono le tabelle di trasposizione 3 e 4 descritte nel paragrafo precedente.

Nel caso un elemento complesso non sia globale (figlio direttamente dell’elemento

schema) ma si trovi all’interno di un tipo complesso, la traduzione rimane quella

precedente con l’aggiunta, nell’interfaccia che rappresenta il complexType contenente l’elemento, di un attribute il cui nome `e quello del nostro oggetto. Si consideri il seguente esempio:

<xsd:element name=”Ordine” type=”OrdineType”/>

<xsd:complexType name=”OrdineType”>

< xsd:element name =”Indirizzo” type=”IndirizzoType”/>

...

</xsd:complexType>

<xsd:complexType name=”IndirizzoType”>

< xsd:element name =”Stato” type=”xsd: string ”/> < xsd:element name =”Citt`a ” type=”xsd: string ”/> < xsd:element name =”Via” type=”xsd: string ”/> < xsd:element name=”Numero” type=”xsd:decimal”/> </xsd:complexType>

traduzione in ODLI3:

interface Ordine : OrdineType (source semistructured Ordine.xml extent Ordine ) {};

{

attribute Indirizzo Indirizzo ; ...

};

interface Indirizzo : IndirizzoType ( source semistructured Ordine.xml extent Indirizzo )

{};

interface IndirizzoType ( source semistructured Ordine.xml)

{

attribute string Stato ;

attribute string Citt`a ;

attribute string Via;

attribute int Numero;

};