XML/Strutture dati di base

< XML
Indice del libro

Obiettivi di apprendimento

  • introdurre il concetto e gli usi delle strutture dati di base
  • descrivere in che modo XML può essere utilizzato per rappresentare strutture di dati di base
  • elencare considerazioni tecniche comuni

Introduzione modifica

Studiando i quattro problemi centrali nella gestione dei dati (acquisizione, archiviazione, recupero e scambio), chi usa XML incontra modelli fondamentali di struttura ricorrenti che si applicano a tutti i tipi di dati nelle fasi di archiviazione e scambio. Questi pattern ricorrono in modo coerente perché il loro uso va oltre i contesti particolari in cui vengono elaborati i dati sottostanti. Chiamiamo questi modelli "strutture dati" (o datatypes).

In questa sezione vedremo alcune delle più fondamentali "strutture dati di base" e spiegheremo perché sono utili, oltre a come lavorare con loro usando XML.

Iniziamo la nostra introduzione con un semplice esempio. Considera una normale lista della spesa di generi alimentari per una famiglia singola.

Esempio introduttivo di lista della spesa:

   La lista della spesa di Andy:
   * uova
   * sciroppo per la tosse (per la nonna)
   * succo d'arancia
   * pane
   * detersivo per lavatrice ** non dimenticarlo **

Quando analizziamo gli aspetti delle informazioni contenute in questa lista della spesa, possiamo fare alcune generalizzazioni:

  • Portabilità: la lista della spesa può essere rappresentata e trasferita facilmente. Se necessario, potrebbe essere memorizzata in un database ed elaborata da un software progettato appositamente, ma potrebbe anche essere facilmente scritta su un pezzo di carta;
  • Comprensibilità: la lista della spesa è prontamente compresa dal pubblico previsto (in questo caso, la persona che ha scritto la lista) e quindi non ha bisogno di ulteriori informazioni o strutture per essere immediatamente utilizzabile;
  • Adattabilità: se sono necessari alcuni cambiamenti (come aggiunte o rimozioni alla lista) c'è una metodologia esistente e ben nota per farlo (per esempio, nel caso di un elenco scritto a mano, semplicemente annotare nuove voci o cancellare le voci indesiderate).

Il concetto fondamentale delle strutture dati di base modifica

Tenendo presente il precedente esempio, ora possiamo introdurre il concetto fondamentale di "struttura dati di base".

  Definizione

Il concetto di strutture dati di base descrive le convenzioni fondamentali che utilizziamo per archiviare i nostri dati, in modo da poterli "scambiare" più facilmente. Quando seguiamo queste convenzioni fondamentali, aiutiamo a garantire portabilità, comprensibilità e adattabilità delle informazioni.

Strutture dati di base definite modifica

Ora che abbiamo introdotto il concetto di strutture dati, possiamo iniziare con alcune definizioni concrete e quindi rivedere quelle definizioni nel contesto del nostro esempio della lista della spesa.

Panoramica delle strutture dati "core" modifica

I seguenti termini definiscono alcune strutture di dati "core"[1] che usiamo in questo capitolo. Questa lista è ordinata per complessità crescente:

  • SimpleBoolean: qualsiasi valore che può essere espresso come "True" o "False".
  • SimpleString: una sequenza contigua di caratteri, compresi caratteri alfanumerici e non alfanumerici.
  • SimpleSequence: un'enumerazione di elementi generalmente accessibili mediante indicizzazione numerica.
  • Nome-valore coppia: un nome singolo arbitrario collegato a un valore singolare.
  • SimpleDictionary: un'enumerazione di elementi generalmente accessibili mediante indicizzazione alfanumerica.
  • SimpleTable: una disposizione ordinata di colonne e righe. Un SimpleTable può essere classificato come una struttura di dati "compositi" (ad es. SimpleSequence in cui ogni elemento della sequenza è un singolo SimpleDictionary).

Un punto importante da ricordare nello studio di queste strutture dati "fondamentali" è che sono "elementari" e "complementari". Cioè le strutture centrali, se utilizzate in combinazione, possono formare strutture più complesse. Una volta che il lettore capirà questo fatto, diventerà evidente che non ci sono applicazioni o specifiche di dati che non possono essere interamente descritte in XML usando nient'altro che queste strutture di dati "core".

Una volta comprese le strutture di dati "core", possiamo usarle in combinazione per rappresentare qualsiasi tipo di informazione strutturata.

Riprendiamo ora l'"Esempio introduttivo di lista della spesa". Quando lo confrontiamo con le strutture di dati "core" che abbiamo appena definito, possiamo fare alcune osservazioni abbastanza semplici:

  • l'intera lista della spesa non può essere rappresentata utilizzando una struttura dati SimpleBoolean, perché le informazioni sono più complesse di "True" o "False";
  • l'intera lista della spesa può essere rappresentata utilizzando una SimpleString;
  • potrebbero esserci motivi per cui non vorremmo utilizzare una SimpleString per rappresentare l'intera lista della spesa. Ad esempio, potremmo voler trasferire l'elenco in un database o in un'altra applicazione software e quindi essere in grado di ordinare, interrogare, duplicare o altrimenti elaborare "singoli articoli" nell'elenco. Trattare l'intero elenco come SimpleString complicherebbe pertanto i nostri requisiti per l'elaborazione.

SimpleString modifica

Diversi modi per rappresentare una SimpleString in XML:

<Esempio>
    <String note="Questo attributo XML contiene una stringa semplice.">
    Questo nodo di testo XML rappresenta una stringa semplice.
   </String>

    <!-- Questo commento XML contiene un SimpleString  -->
    <! [CDATA [Questa sezione CDATA XML contiene una SimpleString. ]]>
</Esempio>

SimpleSequence modifica

Diversi modi per rappresentare SimpleSequence in XML:

<Esempio>
    <!-- usa un singolo attributo XML con un elenco di elementi delimitato da spazi  -->
    <ShoppingList items="uova per il pane succo di latte" />

    <!-- utilizza un singolo attributo XML con un elenco di elementi delimitato da punto e virgola
         (questo ci permette di aggiungere oggetti con spazi in essi)  -->
    <Liste ShoppingList="pane, sciroppo per la tosse, latte, succo di frutta, detersivo per bucato" />

    <!-- ancora un altro modo (ma non necessariamente un buon modo)
         utilizzando più attributi XML  -->
    <ShoppingList item00="bread" item01="eggs" item02="sciroppo per la tosse" />

    <!-- ancora un altro modo
         utilizzando elementi figlio XML  -->
    <ShoppingList>
        <item>uova</item> <item>latte</item> <item>sciroppo per la tosse</item>
   </ShoppingList>
</Esempio>

Coppia nome-valore modifica

SimpleDictionary modifica

SimpleTable modifica

Esempi side-by-side modifica

SimpleTable (XML_Elem):

<table>
    <tr><item>uova</item> <getfor>Andy</getfor> <note></note></tr>
    <tr><item>latte</item> <getfor>Andy</getfor> <note></note></tr>
    <tr> <item>detersivo per lavatrice</item> <getfor>andy</getfor><notes></notes></tr>
    <tr> <item>sciroppo per la tosse</item> <getfor>nonna</getfor><notes>cerca di ottenere il sapore dell'uva</notes></tr>
</table>

SimpleTable (XML_Attr):

<table>
    <tr item="eggs" getfor="andy" notes="" />
    <tr item="milk" getfor="andy" notes="" />
    <tr item="detersivo per bucato" getfor="andy" notes="" />
    <tr item="sciroppo per la tosse" getfor="nonna" note="cerca di ottenere il sapore dell'uva" />
</table>

SimpleTable (XML_Mixed):

<table>
    <tr>
        <item getfor="andy">uova</item> <note></notes>
   </tr>
    <tr>
        <item getfor="andy">milk</item> <notes></notes>
   </tr>
    <tr>
        <item getfor="andy">detersivo per bucato</item> <notes></notes>
       </tr>
    <tr>
        <item getfor="nonna">sciroppo per la tosse</item><note>cerca di ottenere il gusto dell'uva</notes>
   </tr>
</table>

Strutture dati di base in programmazione modifica

Per illustrare ulteriormente come le strutture di dati di base si applicano in molti contesti diversi, alcune delle strutture di dati di base enumerate in precedenza vengono esaminate e confrontate qui nel contesto della programmazione per computer.

Per la prima parte del confronto, esaminiamo la terminologia generica con riferimento a quella utilizzata comunemente nei linguaggi di programmazione:

  • SimpleBoolean: è comunemente chiamato booleano e può solitamente assumere i valori true o false, 0 o 1, o altri valori, a seconda della lingua.
  • SimpleString: comunemente chiamato string o stringBuffer.
  • SimpleSequence: le variabili indicizzate attraverso numeri in programmazione sono comunemente rappresentate con un array.
  • Coppia nome-valore (spiegato più in dettaglio di seguito)
  • SimpleDictionary: questi sono comunemente rappresentati con un dizionario o un array associativo.
  • SimpleTable (spiegato nel dettaglio di seguito)

Considerazioni tecniche modifica

Ora che abbiamo introdotto e discusso esempi specifici delle strutture dati di base, ci sono alcune considerazioni tecniche che si applicano a tutte le strutture di dati, e sono particolarmente importanti per chi è responsabile dell'implementazione e della progettazione di schemi XML, per gestire scenari di implementazione specifici.

  • La terminologia esatta dipende dal contesto: sebbene le strutture "base" qui descritte si applichino a molti scenari diversi, i termini usati per descriverli possono sovrapporsi o entrare in conflitto. Ad esempio, il termine "SimpleSequence" usato qui coincide strettamente con quello che viene chiamato "array" in molti linguaggi di programmazione. Allo stesso modo, il termine "SimpleDictionary" è una scorciatoia per ciò che alcuni linguaggi di programmazione chiamano "array associativo". Sebbene questa stretta correlazione sia intenzionale, bisogna sempre ricordare che le sfumature specifiche di un'applicazione o di un linguaggio di programmazione richiedono un'attenzione supplementare. A volte sorgono piccoli conflitti o discrepanze quando si guarda nei dettagli per una specifica struttura di dati in un dato progetto o una data tecnologia.
  • Le strutture di base sono concetti flessibili: le strutture possono essere definite in modo intercambiabile e alcune strutture possono essere applicate in modo ricorsivo. Ad esempio, si potrebbe facilmente definire una SimpleSequence usando una SimpleString insieme ad alcuni assunti di base (ad esempio, SimpleSequence è una stringa di caratteri alfanumerici in cui ogni elemento della sequenza è separato da uno o più caratteri di spazi vuoti: "uova pane burro latte").
  • Le strutture astratte tendono a nascondere dettagli complicati: ad esempio, il termine "SimpleString" descrive la nozione astratta di una sequenza di caratteri (es. "0-596-00327-7" ). La nozione astratta è abbastanza intuitiva e semplice. Tuttavia, la notazione precisa usata per "implementare" quella nozione astratta e rappresentarla nel codice di lavoro reale è completamente diversa. Diversi linguaggi di programmazione e diversi ambienti possono utilizzare convenzioni diverse per rappresentare la stessa "stringa". A causa di questa variabilità, si può anche dire che la nozione astratta di "SimpleString" in XML è soggetta a rappresentazioni differenti, in base alle esigenze di ogni dato progetto.

Note modifica

  1. Una nota importante: i termini di base qui usati sono generalizzazioni. Sebbene possano coincidere con i termini utilizzati in software, linguaggi di programmazione o applicazioni specifiche, questi non sono intesi come definizioni tecnicamente precise. I concetti qui descritti sono presentati per aiutare a enfatizzare il principio dell'interoperabilità in XML.