In questo Articolo introdurremo le basi del linguaggio XML. Vedremo le caratteristiche e gli usi

In questo articolo, Guida XML – Le basi del linguaggio, introdurremo le basi del linguaggio XML. Vedremo le caratteristiche e gli usi del linguaggio stesso

main.zip (200 download )

Introduzione all’XML: Comprendere il Meta-Linguaggio di Markup

Spesso si tende a pensare che l’XML (eXtensible Markup Language) sia semplicemente un altro linguaggio di markup o, peggio, una versione modernizzata dell’intramontabile HTML. Nulla di più lontano dalla verità. XML è un meta-linguaggio di markup, un sistema che consente di creare altri linguaggi di markup personalizzati. A differenza di HTML, che dispone di un set rigido di tag predefiniti per la creazione di pagine web, XML non ha un repertorio di tag standard né è pensato per la programmazione o per la generazione diretta di pagine web. Al contrario, il suo scopo è esclusivamente quello di definire nuovi linguaggi in base alle esigenze specifiche.

Ma cosa si cela realmente dietro l’XML? In poche parole, non è altro che un insieme standard di regole sintattiche per organizzare e modellare la struttura dei dati e dei documenti. Queste regole, o meglio, specifiche tecniche, forniscono un framework per sviluppare linguaggi di markup personalizzati. Il World Wide Web Consortium (W3C) è l’organismo ufficiale che definisce tali specifiche, e le relative linee guida sono pubblicamente disponibili all’indirizzo http://www.w3.org/XML.

L’Impatto dell’XML: Una Rivoluzione Silenziosa

Perché l’XML è così discusso e acclamato nel mondo informatico? Quali possibilità apre questo meta-linguaggio e perché viene considerato una piccola rivoluzione? La risposta risiede nella sua flessibilità e nella capacità di gestire i dati in modo strutturato e interoperabile. Grazie a XML, è possibile definire formati di dati personalizzati che possono essere utilizzati per scambi di informazioni tra sistemi, integrazioni software e molto altro.

Nella presente guida esploreremo le risposte a queste domande, offrendo una panoramica sulle tecnologie collegate a XML e il suo ecosistema. Ma prima, iniziamo col capire le motivazioni che hanno portato all’introduzione di questo potente strumento.

Internet, Web e la Necessità degli Standard: La Nascita di XML

Internet e il Web, per loro natura decentralizzata e aperta, sono progettati per essere accessibili a una vasta gamma di dispositivi e piattaforme. Tuttavia, proprio questa caratteristica richiede standard condivisi che garantiscano usabilità e progresso senza confusione o frammentazioni. Per rispondere a questa esigenza, nel dicembre 1994 nasce il World Wide Web Consortium (W3C), un’organizzazione con l’obiettivo di creare standard riconosciuti dai principali attori del settore, tra cui l’ormai onnipresente linguaggio HTML.

La Guerra dei Browser: Sfide e Lotte degli Anni ’90

Gli anni ’90 segnarono il boom di Internet e l’ascesa esplosiva del Web, ma portarono con sé anche una delle più accese competizioni tecnologiche e commerciali: la guerra dei browser tra Netscape e Microsoft. In questa lotta serrata, ogni versione aggiornata di un browser introduceva estensioni proprietarie all’HTML, sfidando gli standard ufficiali.

Le conseguenze furono disastrose: i siti che adottavano estensioni specifiche per un browser rischiavano di risultare incompatibili con altri. La situazione si aggravò ulteriormente con l’arrivo del Dynamic HTML (DHTML), il cui utilizzo variava ampiamente e arbitrariamente tra i diversi produttori di browser.

Di fronte a questo scenario caotico, il W3C si trovò a rincorrere una continua evoluzione “de facto” dell’HTML, costretto a decidere quali nuove funzionalità integrare come standard ufficiali e quali invece escludere.

La Risposta del W3C: La Creazione di XML

In questo contesto emerse la necessità di un linguaggio che offrisse sia libertà nella definizione dei tag, sia un rigoroso rispetto degli standard. Per soddisfare questa esigenza, nel 1996 il W3C istituì l’XML Working Group con l’obiettivo di sviluppare un linguaggio di markup che garantisse compatibilità e flessibilità.

La base di partenza della ricerca fu il linguaggio SGML (Standard Generalized Markup Language), un potente meta-linguaggio per la creazione di linguaggi di markup. Tuttavia, l’SGML si rivelò eccessivamente complesso per gli scopi prefissati, motivo per cui venne semplificato e snellito, portando alla nascita di XML.

L’Evoluzione di XML: Dal Web a Contesti Diversificati

Nel dicembre del 1997, le specifiche dell’XML furono pubblicate come Proposed Recommendation. Sebbene inizialmente concepito per risolvere le problematiche legate agli standard del Web, si scoprì rapidamente che il potenziale di XML andava ben oltre.

Grazie alla sua versatilità, l’XML si adattava perfettamente a contesti diversi: dalla definizione di formati di dati personalizzati, alla struttura di documenti, dallo scambio di informazioni tra sistemi eterogenei, fino alla rappresentazione grafica di immagini. Questo aspetto ha trasformato XML in una vera e propria rivoluzione, capace di ridefinire il modo in cui i dati vengono organizzati e condivisi nel mondo digitale.

XML: Standard e Struttura al Servizio della Flessibilità

Come accennato in precedenza, XML (eXtensible Markup Language) rappresenta un insieme standard di regole sintattiche per modellare la struttura di documenti e dati. Due parole chiave nella sua definizione – standard e struttura – ne delineano l’essenza.

L’adesione a uno standard significa che XML è indipendente da piattaforme specifiche, siano esse hardware o software, e da produttori particolari. In altre parole, definendo un linguaggio di markup basato su XML, possiamo essere certi che esistono strumenti compatibili su una vasta gamma di piattaforme, pronti a comprenderlo ed elaborarlo senza problemi.

Inoltre, XML si concentra sulla struttura dei dati e dei documenti, lasciando da parte altri aspetti come il tipo di dati o la loro presentazione. Questi elementi, infatti, non rientrano nel dominio di XML, ma sono affidati a tecnologie complementari, alcune delle quali sono state sviluppate direttamente basandosi su XML stesso. Questo sottolinea la sua flessibilità e universalità.

Un Ecosistema Intorno a XML: Tecnologie Correlate

L’importanza di XML non risiede solo nel linguaggio in sé, ma anche nell’ecosistema tecnologico che lo circonda. Una serie di strumenti e linguaggi collaterali ampliano le potenzialità di XML, rendendolo versatile e adatto a numerosi contesti.

Ecco alcune delle principali tecnologie che ruotano intorno a XML:

  • DTD e XML Schema: Permettono di creare grammatiche che definiscono formalmente la struttura dei dati, garantendo la possibilità di verificarne la correttezza.
  • CSS, XSL e XSL-FO: Consentono di gestire la presentazione dei dati e di trasformarli in altri formati, rendendoli adatti a esigenze specifiche.
  • XLink e XPointer: Offrono strumenti per collegare documenti XML tra loro, facilitando la creazione di reti di dati interconnessi.
  • XQuery e XQL: Permettono di eseguire query sui dati XML, estrapolando informazioni in base a criteri predefiniti.

Una Rivoluzione Universale

Gli esempi sopra mostrano chiaramente che XML non è semplicemente una revisione di idee preesistenti. Al contrario, rappresenta il cuore di un sistema che consente di ottenere risultati in una vasta gamma di applicazioni, mantenendo al contempo uno standard condiviso. Questa caratteristica lo rende un elemento fondamentale per l’interoperabilità e l’evoluzione tecnologica in ambiti diversi, dal Web alla gestione dei dati aziendali.

La Struttura dei Documenti XML

Rappresentare l’Informazione in un Documento XML

XML, come meta-linguaggio, permette di definire strutture di documenti e dati in modo personalizzato. Nella terminologia XML, il termine documento assume un significato più ampio rispetto a quello tradizionale: non si limita a pagine web o elaborati di testo, ma rappresenta un generico contenitore di informazioni, indipendentemente dal loro utilizzo.

Cos’è un File XML?

Un documento XML non è altro che un file di testo strutturato, che contiene tag, attributi e testo organizzati secondo regole sintattiche rigorose. Analizziamolo dal punto di vista logico e sintattico, introducendo concetti fondamentali per comprendere pienamente il funzionamento e le possibilità offerte da XML.

Struttura Gerarchica

Un file XML è organizzato secondo una struttura gerarchica. Ogni documento si compone di elementi, i quali rappresentano i componenti logici del contenuto. Gli elementi possono contenere sottoelementi, testo, oppure entrambi. In aggiunta, gli elementi possono avere attributi, che ne descrivono ulteriori proprietà.

La struttura segue un’architettura arborea, con un elemento principale chiamato radice o “root”. La radice racchiude tutti gli altri elementi, e la struttura complessiva può essere rappresentata come un albero, noto come document tree.

Esempio di Struttura ad albero in XML

Un esempio pratico ci aiuta a visualizzare la rappresentazione gerarchica di un documento XML. Consideriamo un articolo tecnico composto da diversi paragrafi, ognuno contenente testo, esempi di codice o immagini.

Struttura Logica

L’elemento radice (root) è articolo, che contiene una serie di elementi figli come paragrafi, testo e immagini. Inoltre, molti di questi elementi possiedono attributi come titolo, tipo o file.

Struttura Fisica

Ecco come la struttura fisica potrebbe essere implementata:

<?xml version="1.0" ?>
<Libro titolo="Titolo del libro">
  <capitolo titolo="Titolo del primo capitolo">
    <testo>Blocco di testo del primo capitolo</testo>
    <immagine file="immagine1.jpg"></immagine>
  </capitolo>
  <capitolo titolo="Titolo del secondo capitolo">
    <testo>Blocco di testo del secondo capitolo</testo>
    <paragrafo>Esempio di paragrafo</paragrafo>
    <testo>Altro blocco di testo</testo>
  </capitolo>
  <paragrafo tipo="bibliografia">
    <testo>Riferimento ad un articolo</testo>
  </paragrafo>
</Libro>

HTML vs XML: I Tag e la Sintassi

Nel corpo del documento XML, gli elementi sono rappresentati da tag, delimitati da < e > come in HTML. Tuttavia, mentre in HTML i tag sono predefiniti, XML offre la libertà di definire tag personalizzati a seconda delle esigenze.

Annidamento e Gerarchia

L’organizzazione gerarchica in XML si realizza tramite l’annidamento degli elementi. Ogni elemento può contenere altri elementi, creando una struttura logica ordinata.

Elementi Vuoti

Un elemento può essere vuoto, cioè privo di contenuto. In XML, anche gli elementi vuoti devono rispettare le regole sintattiche, includendo sia un tag di apertura che uno di chiusura. Tuttavia, è disponibile una sintassi abbreviata che utilizza /> per chiudere il tag, ad esempio:

<immagine file="immagine1.jpg"/>

Entrambe le notazioni sono equivalenti.

Documenti Ben Formati: Regole Fondamentali per XML

XML richiede una sintassi rigorosa, necessaria per garantire la corretta interpretazione dei documenti. Questo rigore è riassunto in un principio centrale: tutti i documenti XML devono essere ben formati (well-formed). Questo concetto può essere paragonato alla correttezza ortografica in una lingua: senza il rispetto delle regole, il documento non sarà interpretabile.

Cosa Significa “Ben Formato”?

Affinché un documento XML sia considerato ben formato, deve rispettare alcune regole fondamentali:

  1. Elemento Radice Unico: Ogni documento deve avere un solo elemento principale (root) che racchiuda tutti gli altri elementi. Le uniche parti XML consentite al di fuori di questo elemento sono i commenti e le direttive di elaborazione (es.: dichiarazione della versione XML).
  2. Tag di Chiusura: Ogni elemento deve avere un tag di chiusura oppure utilizzare la sintassi abbreviata per gli elementi vuoti (/>).
  3. Annidamento Corretto: Gli elementi devono essere opportunamente nidificati. I tag di chiusura devono seguire l’ordine inverso dei rispettivi tag di apertura.
  4. Distinzione Maiuscole/Minuscole: XML distingue tra lettere maiuscole e minuscole; pertanto, i nomi dei tag e degli attributi devono coincidere esattamente nei tag di apertura e chiusura.
  5. Valori degli Attributi: Devono essere sempre racchiusi tra apici (singoli o doppi).

Esempi di Errori Comuni

Quando si utilizza un semplice editor di testo, possono verificarsi errori come:

Tag Malformati:

Copy
<articolo titolo=test> <!-- ... --> </Articolo> 

Questo esempio viola le regole perché i tag di apertura e chiusura non corrispondono (il caso delle lettere è diverso). Inoltre, il valore dell’attributo titolo non è racchiuso tra apici.

Annidamento Scorretto:

<paragrafo> <testo>abcdefghi... </paragrafo></testo>

In questo caso, il tag <testo> è chiuso fuori ordine rispetto al suo tag di apertura.

Regole per i Nomi dei Tag

I nomi dei tag in XML devono seguire alcune regole precise:

  • Devono iniziare con una lettera o un underscore (_).
  • Possono contenere lettere, numeri, punti, underscore e trattini (-).
  • Non sono ammessi spazi o caratteri speciali.
  • XML è case sensitive: <prova> e <Prova> sono considerati tag differenti.

Caratteri e Codifica in XML

Un documento XML può contenere diversi caratteri, come lettere latine, cifre e segni di punteggiatura. Tuttavia, per includere caratteri speciali (es.: lettere accentate o simboli di valuta), è necessario specificare una codifica. Ad esempio:

xml

<?xml version="1.0" encoding="iso-8859-1"?>

Questa direttiva consente l’uso del set di caratteri Latin-1, che include lettere accentate e simboli.

XML supporta anche la codifica Unicode, permettendo di rappresentare caratteri greci, cirillici, ideogrammi cinesi o giapponesi.

Entità e Caratteri Speciali

Per evitare che alcuni caratteri vengano interpretati erroneamente come parte della sintassi XML, si utilizzano delle entità predefinite:

Ad esempio, il seguente testo:

<testo>
    Il simbolo < indica "minore di".
</testo>

deve essere corretto come segue:

<testo>
    Il simbolo < indica "minore di".
</testo>

Sezioni CDATA

In presenza di molti caratteri speciali, l’uso di entità può rendere il documento meno leggibile. In questi casi, è possibile utilizzare una sezione CDATA (Character DATA), che permette di includere blocchi di testo non elaborati dal parser XML. Ad esempio:

<codice>
   <![CDATA[
      <libro>
         <capitolo>
         </capitolo>
      </libro>
   ]]>
</codice>

Le sezioni CDATA sono particolarmente utili quando si deve includere codice XML o altri caratteri speciali come testo.

Documenti Validi: Scrivere e Convalidare Documenti XML con Grammatiche

Una delle principali caratteristiche di XML è la libertà di definire i propri tag secondo necessità. Tuttavia, questa flessibilità può portare a una mancanza di coerenza e chiarezza nei documenti. Per evitare ambiguità e assicurare una struttura logica predefinita, è fondamentale utilizzare un meccanismo che vincoli e regoli l’uso dei tag.

La Necessità di una Grammatica

Per mantenere l’integrità dei documenti XML, è necessario stabilire una grammatica. In questo contesto, una grammatica è un insieme di regole che definisce:

  • Quali tag (elementi) possono essere utilizzati.
  • La struttura che deve seguire un documento XML.

Se un documento XML rispetta le regole di una grammatica specifica, viene definito valido per quel linguaggio. La caratteristica di validità si aggiunge a quella di ben formattato, rendendo i documenti idonei all’elaborazione automatica.

Ben Formato vs Valido

  • Un documento ben formato segue rigorosamente le regole sintattiche di XML.
  • Un documento valido non solo è ben formato, ma rispetta anche le regole specifiche di una determinata grammatica.

Nota importante: un documento può essere ben formato ma non valido rispetto a una grammatica. Inoltre, un documento valido per una grammatica potrebbe non essere valido per un’altra.

Creare Grammatiche per Documenti XML

Esistono due approcci principali per definire le grammatiche in XML:

  1. DTD (Document Type Definition): un metodo più semplice e tradizionale.
  2. XML Schema: uno standard più avanzato e versatile.

Questi strumenti consentono di stabilire regole per la creazione e la validazione dei documenti XML e saranno approfonditi in seguito.

Tipologie di Parser per Documenti XML

Prima che un documento XML possa essere utilizzato nei suoi molteplici contesti applicativi (come la generazione di altri documenti, il controllo di programmi o la rappresentazione di immagini), è fondamentale eseguire due tipi di elaborazione preliminare:

  1. Verifica della corretta formattazione (ben formato).
  2. Validazione rispetto a una grammatica.

Questi processi sono eseguiti dai parser, strumenti software disponibili su diverse piattaforme. I parser si dividono in due categorie principali:

  • Parser Non Validanti: controllano solo che un documento XML sia ben formato.
  • Parser Validanti: verificano sia la formattazione sia la conformità a una grammatica.

Molti editor XML moderni includono parser integrati o si basano su parser esterni per convalidare i documenti.

Convalidare Documenti XML con il Codice

Per la validazione tramite codice, sono disponibili diverse librerie, tra cui:

  • MSXML: una libreria integrata in Internet Explorer dalla versione 4.0.
  • Xerces: una libreria open-source avanzata e ampiamente utilizzata.
  • XML4J: una libreria basata su Java per la validazione e l’elaborazione di documenti XML.

Documenti Validi: Scrivere e Convalidare Documenti XML con Grammatiche

Una delle principali caratteristiche di XML è la libertà di definire i propri tag secondo necessità. Tuttavia, questa flessibilità può portare a una mancanza di coerenza e chiarezza nei documenti. Per evitare ambiguità e assicurare una struttura logica predefinita, è fondamentale utilizzare un meccanismo che vincoli e regoli l’uso dei tag.

La Necessità di una Grammatica

Per mantenere l’integrità dei documenti XML, è necessario stabilire una grammatica. In questo contesto, una grammatica è un insieme di regole che definisce:

  • Quali tag (elementi) possono essere utilizzati.
  • La struttura che deve seguire un documento XML.

Se un documento XML rispetta le regole di una grammatica specifica, viene definito valido per quel linguaggio. La caratteristica di validità si aggiunge a quella di ben formattato, rendendo i documenti idonei all’elaborazione automatica.

Ben Formato vs Valido

  • Un documento ben formato segue rigorosamente le regole sintattiche di XML.
  • Un documento valido non solo è ben formato, ma rispetta anche le regole specifiche di una determinata grammatica.

Nota importante: un documento può essere ben formato ma non valido rispetto a una grammatica. Inoltre, un documento valido per una grammatica potrebbe non essere valido per un’altra.

Creare Grammatiche per Documenti XML

Esistono due approcci principali per definire le grammatiche in XML:

  1. DTD (Document Type Definition): un metodo più semplice e tradizionale.
  2. XML Schema: uno standard più avanzato e versatile.

Questi strumenti consentono di stabilire regole per la creazione e la validazione dei documenti XML e saranno approfonditi in seguito.

Tipologie di Parser per Documenti XML

Prima che un documento XML possa essere utilizzato nei suoi molteplici contesti applicativi (come la generazione di altri documenti, il controllo di programmi o la rappresentazione di immagini), è fondamentale eseguire due tipi di elaborazione preliminare:

  1. Verifica della corretta formattazione (ben formato).
  2. Validazione rispetto a una grammatica.

Questi processi sono eseguiti dai parser, strumenti software disponibili su diverse piattaforme. I parser si dividono in due categorie principali:

  • Parser Non Validanti: controllano solo che un documento XML sia ben formato.
  • Parser Validanti: verificano sia la formattazione sia la conformità a una grammatica.

Molti editor XML moderni includono parser integrati o si basano su parser esterni per convalidare i documenti.

Convalidare Documenti XML con il Codice

Per la validazione tramite codice, sono disponibili diverse librerie, tra cui:

  • MSXML: una libreria integrata in Internet Explorer dalla versione 4.0.
  • Xerces: una libreria open-source avanzata e ampiamente utilizzata.
  • XML4J: una libreria basata su Java per la validazione e l’elaborazione di documenti XML.

DTD: Definizione e Descrizione delle Grammatiche per Documenti XML

Nel panorama delle tecnologie XML, il Document Type Definition (DTD) rappresenta il primo approccio cronologicamente introdotto per descrivere grammatiche e regole per la validazione di documenti XML. Grazie alla DTD è possibile definire:

  • I tag utilizzabili in un documento XML.
  • Le loro relazioni strutturali all’interno del documento.
  • Le proprietà e gli attributi associati a ciascun tag.

Struttura e Sintassi di un DTD

La sintassi di un DTD è caratterizzata da due elementi chiave:

  1. <!ELEMENT>: Specifica gli elementi utilizzabili nel documento e la loro struttura.
  2. <!ATTLIST>: Definisce gli attributi di ciascun elemento.

Dichiarazione degli Elementi

La definizione di un elemento determina la sua posizione all’interno della gerarchia del documento XML e il numero delle sue occorrenze. Ecco alcune regole fondamentali:

  • +: L’elemento deve comparire una o più volte.
  • \*: L’elemento può comparire zero o più volte.
  • ?: L’elemento è facoltativo e può comparire al massimo una volta.
Esempio:
<!ELEMENT articolo (paragrafo+)>

Questa dichiarazione specifica che l’elemento <articolo> può contenere uno o più <paragrafo> come sottoelementi.

Un altro esempio più articolato:

<!ELEMENT paragrafo (immagine*, testo+)>
  • <immagine> è facoltativo e può ripetersi più volte.
  • <testo> è obbligatorio e deve comparire almeno una volta.

Elementi Vuoti e Contenuto di Testo

Per definire elementi che non contengono sottoelementi o che racchiudono solo testo, si utilizzano dichiarazioni specifiche:

  • Elementi vuoti:
<!ELEMENT immagine EMPTY>
  • Elementi contenenti testo:
<!ELEMENT testo (#PCDATA)>
  • Elementi con contenuto non definito:
<!ELEMENT elemento ANY>

Gli elementi definiti come ANY possono contenere testo, sottoelementi o restare vuoti, senza alcuna restrizione.

Definizione degli Attributi

Gli attributi di un elemento sono dichiarati tramite <!ATTLIST>, specificando il nome, il tipo e le regole di presenza. Esempio:

<!ATTLIST articolo titolo CDATA #REQUIRED>

Questo indica che l’elemento <articolo> ha un attributo titolo, il cui valore può essere qualsiasi combinazione di caratteri (CDATA) e la cui presenza è obbligatoria (#REQUIRED).

Altri Tipi di Attributi:

  1. #IMPLIED: L’attributo è opzionale.
  2. #FIXED valore: L’attributo ha un valore fisso e predeterminato.
  3. Valori predefiniti alternativi:
<!ATTLIST paragrafo
      tipo (abstract|bibliografia|note) #IMPLIED>

In questo caso, l’attributo tipo è opzionale e può assumere uno tra i valori abstract, bibliografia o note.

Un Esempio Completo di DTD

Ecco un esempio completo di DTD per un documento che rappresenta un articolo:

<!ELEMENT articolo (paragrafo+)>
<!ELEMENT paragrafo (immagine*, testo+, codice*)>
<!ELEMENT immagine EMPTY>
<!ELEMENT testo (#PCDATA)>
<!ELEMENT codice (#PCDATA)>

<!ATTLIST articolo
      titolo CDATA #REQUIRED>
<!ATTLIST paragrafo
      titolo CDATA #IMPLIED
      tipo (abstract|bibliografia|note) #IMPLIED>
<!ATTLIST immagine
      file CDATA #REQUIRED>

Questa DTD descrive:

  • Un elemento <articolo> contenente uno o più <paragrafo>.
  • Ogni <paragrafo> può includere zero o più <immagine>, almeno un <testo> e opzionalmente <codice>.
  • Attributi obbligatori e opzionali sono definiti con regole specifiche.

Entità, Documenti e Considerazioni su XML

Definizione di Entità Personalizzate nei DTD

Nel contesto di XML, le entità sono strumenti potenti che consentono di sostituire sequenze di caratteri con nomi speciali, strutturati nella forma &nome;. Questo meccanismo può essere esteso tramite i DTD (Document Type Definition) per definire entità personalizzate, utili a semplificare e standardizzare il contenuto dei documenti.

Creazione di un’Entità Personalizzata

Per definire un’entità personalizzata in un DTD si utilizza la dichiarazione <!ENTITY>. Ad esempio, per rappresentare l’abbreviazione della stringa “HyperText Markup Language” con l’entità &html;, si utilizza la seguente definizione:

<!ENTITY html "HyperText Markup Language">

Questa dichiarazione permette di utilizzare &html; in qualsiasi punto del documento XML, sostituendo automaticamente la stringa “HyperText Markup Language”.

Collegare un Documento XML al suo DTD

Una volta definito il DTD, è necessario specificare il legame tra un documento XML e la relativa grammatica affinché un parser XML possa verificare sia la correttezza sintattica (documento ben formato), sia la validità rispetto al DTD.

Esistono due modalità per fare riferimento a un DTD:

  1. Inclusione Diretta nel Documento XML

Il DTD può essere incluso direttamente all’interno del documento XML tramite la dichiarazione <!DOCTYPE>, come nell’esempio seguente:

<?xml version="1.0"?>
<!DOCTYPE articolo SYSTEM "articolo.dtd">
<articolo>
  <paragrafo>Questo è un paragrafo.</paragrafo>
</articolo>

Il file articolo.dtd contiene il DTD e il parser XML utilizzerà le sue regole per validare il documento. Se il DTD è pubblicato su un sito web, l’URI può essere indicato come URL assoluto:

<!DOCTYPE articolo SYSTEM "http://www.myXML.it/articolo.dtd">

Vantaggi e Limiti dei DTD

L’utilizzo dei DTD offre un controllo più rigoroso sulla struttura e sull’uso dei tag nei documenti XML, mitigando i rischi derivanti dalla libertà nella definizione dei tag. Tuttavia, i DTD presentano alcune limitazioni:

  • Sintassi non basata su XML: Le regole dei DTD non seguono la sintassi di XML, creando potenziale confusione per chi lavora esclusivamente con XML.
  • Limitazioni nella definizione degli attributi: Non è possibile specificare tipi di dato per gli attributi né definire limiti sul numero minimo o massimo di occorrenze di un elemento.
  • Flessibilità limitata: Mancano meccanismi avanzati per esprimere condizioni complesse di validazione.

Questi svantaggi hanno portato allo sviluppo di approcci alternativi, come XML Schema, che affrontano queste problematiche offrendo una maggiore flessibilità e precisione nella definizione delle grammatiche.

XML Schema: Elementi e Struttura

Cos’è un XML Schema?

Un XML Schema è una descrizione formale che definisce la grammatica di un linguaggio di markup basato su XML. Come i DTD (Document Type Definition), consente di specificare:

  • Gli elementi utilizzabili in un documento XML.
  • La struttura complessiva del documento.
  • Le relazioni e i vincoli tra gli elementi e gli attributi.

Tuttavia, rispetto ai DTD, gli XML Schema forniscono un livello di controllo più sofisticato, superando alcune importanti limitazioni dei DTD.

Le Differenze Principali tra XML Schema e DTD

  1. Sintassi:
    • I DTD utilizzano una propria sintassi specifica, mentre un XML Schema si basa sulla stessa sintassi XML.
    • Questo rende XML Schema più integrato nell’universo XML e facilmente leggibile.
  2. Tipi di Dato:
    • Nei DTD, non è possibile specificare il tipo di dato degli attributi o degli elementi (tutti sono considerati stringhe generiche).
    • XML Schema consente di definire tipi di dato precisi, come numeri interi, date o booleani, aumentando notevolmente la flessibilità.
  3. Vincoli Avanzati:
    • XML Schema permette di specificare limiti sul numero di occorrenze di un elemento (es. massimo o minimo), cosa non possibile nei DTD.
    • È possibile applicare regole più complesse per validare i contenuti.
  4. Namespace:
    • XML Schema supporta i namespace per distinguere i tag appartenenti a grammatiche diverse, riducendo ambiguità.

Struttura Generale di un XML Schema

Un XML Schema è un documento XML che descrive le regole di una grammatica attraverso un linguaggio di markup specifico. Ogni XML Schema ha un elemento radice (<xs:schema>), che contiene tutte le definizioni. Esempio:

<xs:element name="testo" type="xs:string" />

Questa dichiarazione specifica un elemento <testo> che può contenere solo stringhe (xs:string). La stessa dichiarazione in un DTD sarebbe:

<!ELEMENT testo (#PCDATA)>

Tipi di Dato: Semplici e Complessi

Una delle caratteristiche distintive degli XML Schema è la possibilità di definire tipi di dato:

  • Tipi di Dato Semplici: Definiscono contenuti elementari (es. stringhe, numeri, date).
  • Tipi di Dato Complessi: Permettono di combinare elementi e attribuirvi strutture gerarchiche.

Esempio di tipo semplice:

<xs:element name="eta" type="xs:integer" />

Esempio di tipo complesso:

<xs:complexType name="Persona">
  <xs:sequence>
    <xs:element name="nome" type="xs:string" />
    <xs:element name="eta" type="xs:integer" />
  </xs:sequence>
</xs:complexType>

In questo caso, il tipo Persona contiene una sequenza di due elementi: nome e eta.

Vantaggi degli XML Schema

  1. Maggiore Controllo: Possibilità di specificare tipi di dato e vincoli.
  2. Compatibilità XML: Utilizzando la sintassi XML, è possibile elaborare lo schema con gli stessi strumenti XML.
  3. Namespace: Fornisce un meccanismo integrato per la distinzione tra grammatiche.
  4. Espandibilità: Permette una maggiore modularità, consentendo il riutilizzo delle definizioni.

Integrazione di Grammatiche e Namespace

Collegare un Documento XML alla Sua Grammatica di Riferimento

Quando si utilizza un XML Schema per definire la grammatica di un linguaggio XML, è fondamentale connettere il documento XML allo schema corrispondente, affinché un parser XML validante possa verificare sia la formattazione corretta (ben formata) sia la validità del documento rispetto alla grammatica. Per fare ciò, il parser necessita di due elementi:

  • Il documento XML da validare.
  • Lo XML Schema che specifica la grammatica.

Riferimento allo Schema XML nel Documento

Un metodo comune per fornire informazioni sullo schema è includere nel documento XML un riferimento diretto associato all’elemento root. Ecco un esempio pratico:

<articolo
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="guidaXML.xsd"
   titolo="profgiagnotti"
>

In questo caso:

  • xmlns:xsi: Questo attributo indica l’URL dello schema di riferimento per dichiarare informazioni legate allo schema (schema instance). Il valore fornito è uno standard W3C.
  • xsi:noNamespaceSchemaLocation: Specifica il percorso (relativo o assoluto) al file contenente lo schema XML, in questo caso guidaXML.xsd.

Con queste informazioni, il parser XML è in grado di validare il documento confrontandolo con le regole definite nello schema.

Integrazione di Grammatiche Diverse

Uno degli obiettivi desiderabili nella creazione di un linguaggio XML è la possibilità di integrare elementi da grammatiche diverse, permettendo di riutilizzare componenti già sviluppati. Ad esempio:

  • Si può combinare un linguaggio per la descrizione di articoli tecnici con uno per le bibliografie, creando un linguaggio ibrido.

Tuttavia, questa composizione pone alcune sfide:

  1. Validazione di Documenti Ibridi:
    • Con quale schema si deve validare un documento XML che utilizza due grammatiche diverse?
  2. Ambiguità nei Nomi di Tag o Attributi:
    • Linguaggi differenti potrebbero utilizzare gli stessi nomi per tag o attributi. Come gestire questa sovrapposizione?

Namespace: La Soluzione alle Ambiguità

I namespace risolvono i problemi di integrazione e ambiguità. Un namespace è un insieme di nomi (di elementi e attributi) identificati in modo univoco tramite un URI (Uniform Resource Identifier). Ogni namespace garantisce che i nomi definiti al suo interno non entrino in conflitto con quelli di altri namespace.

Esempio di Problema Risolto dai Namespace:

Se due grammatiche diverse utilizzano il tag <indirizzo>, una per dati anagrafici e l’altra per messaggi di posta elettronica, i namespace garantiscono che i due <indirizzo> siano distinti.

Riferimenti ai Namespace in un Documento XML

I namespace si integrano direttamente nel documento XML attraverso la loro dichiarazione. Esempio:

<articolo xmlns:biblio="http://www.bibliografie.it/schema"
          xmlns:art="http://www.articoli.it/schema">
   <art:paragrafo>Testo tecnico.</art:paragrafo>
   <biblio:riferimento>Un articolo interessante.</biblio:riferimento>
</articolo>

In questo esempio:

  • xmlns:biblio e xmlns:art: Dichiarano i namespace per i due linguaggi.
  • Gli elementi art:paragrafo e biblio:riferimento appartengono a namespace diversi, evitando ambiguità.

Validazione di Documenti con Namespace Multipli

Quando un documento XML utilizza più namespace, è necessario associare ogni namespace al relativo schema XML. Questo si fa attraverso i namespace e gli schemi XML associati. Ogni schema definisce implicitamente un namespace che raggruppa i suoi elementi e attributi.

Ad esempio, per validare un documento ibrido con due schemi:

<articolo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:biblio="http://www.bibliografie.it/schema"
          xmlns:art="http://www.articoli.it/schema"
          xsi:schemaLocation="
            http://www.bibliografie.it/schema biblio.xsd
            http://www.articoli.it/schema articoli.xsd">
    <art:paragrafo>Testo 1</art:paragrafo>
    <biblio:riferimento>Testo 2</biblio:riferimento>
</articolo>

Con xsi:schemaLocation, si specificano gli schemi XML per ogni namespace.

Presentazione di XML con CSS

La Differenza tra HTML e XML nella Presentazione

A differenza di HTML, un linguaggio progettato sia per strutturare che per presentare documenti, XML è un linguaggio generico che si limita a descrivere i dati senza assegnare loro una semantica di presentazione. Di conseguenza, quando un documento XML viene aperto in un browser, appare generalmente come puro testo, talvolta arricchito da un’indentazione automatica e una colorazione dei tag preimpostate dal browser stesso.

Per gestire la presentazione dei contenuti XML, è possibile ricorrere a CSS (Cascading Style Sheets), utilizzandoli in modo simile a quanto si fa con i documenti HTML.

Utilizzo di CSS con XML

Definire Regole di Stile

Le regole di stile nei CSS sono scritte nel formato seguente:

selettore { proprietà: valore; proprietà: valore; ... }
  • Selettore: Specifica a quale elemento del documento XML applicare lo stile.
  • Proprietà e Valori: Definiscono le caratteristiche di presentazione.

Esempio per l’elemento <paragrafo>:

paragrafo { display: block; font-size: 12pt; text-align: left; }

Differenze tra CSS per HTML e XML

Quando si utilizzano i CSS per HTML, molti elementi hanno una formattazione predefinita (ad esempio, <h1> è un titolo grande, <p> è un paragrafo separato). Con XML, invece, gli elementi non hanno alcun significato di presentazione predefinito. Pertanto, è necessario definire interamente lo stile, compresa la modalità di visualizzazione degli elementi.

Se non viene specificato uno stile, il contenuto del documento XML potrebbe apparire come un’unica stringa di testo continua.

Riferire un Foglio di Stile a un Documento XML

Un foglio di stile CSS viene generalmente salvato come file con estensione .css. Per collegare il documento XML al foglio di stile, si utilizza la seguente direttiva:

<?xml-stylesheet type="text/css" href="stile.css" ?>

Questa dichiarazione indica al browser di applicare il file CSS specificato (stile.css) al documento XML.

Limitazioni dell’Utilizzo di CSS con XML

Nonostante la loro utilità, i CSS presentano alcune limitazioni significative quando utilizzati con documenti XML:

  1. Assenza di Supporto per Attributi: CSS non consente di accedere ai valori degli attributi per visualizzarli.
  2. Mancanza di Funzionalità per Supporti Diversi: I CSS sono progettati principalmente per il Web, risultando carenti in ambiti come la stampa. Ad esempio, non offrono strumenti avanzati per l’impaginazione su carta.
  3. Documenti Non Visualizzabili in un Browser: In alcuni casi, un documento XML potrebbe non essere destinato alla visualizzazione diretta (es. XML per la descrizione di immagini o ambienti virtuali). In tali situazioni, i CSS sono inutili per la gestione della presentazione.

Alternative: L’Introduzione di XSL

Per affrontare le limitazioni dei CSS, il W3C ha sviluppato uno standard più avanzato chiamato XSL (eXtensible Stylesheet Language). XSL offre maggiore flessibilità, permettendo non solo la presentazione dei documenti XML, ma anche la loro trasformazione in altri formati più adatti alla visualizzazione o all’elaborazione.

XSL: eXtensible Stylesheet Language

Introduzione a XSL

L’eXtensible Stylesheet Language (XSL) è una potente tecnologia composta da tre linguaggi distinti, progettata per gestire l’elaborazione e la presentazione di documenti XML in modo altamente flessibile. La sua struttura è basata sull’osservazione che il processo di presentazione dei dati può essere suddiviso in tre passaggi principali:

  1. Individuare i dati da presentare.
  2. Controllare l’elaborazione dei dati, definendo come devono essere presentati.
  3. Specificare la formattazione, ovvero il layout e lo stile visivo finale.

A ciascuno di questi compiti, XSL associa uno specifico linguaggio:

  • XPath: Individua elementi e attributi di un documento XML su cui eseguire operazioni.
  • XSLT (XSL Transformations): Trasforma i dati XML in formati presentabili come HTML, testo o altri documenti XML.
  • XSL-FO (XSL Formatting Objects): Definisce un insieme di tag per la formattazione dei dati, utile soprattutto in scenari di pubblicazione come la stampa.

I Tre Componenti di XSL

1. XPath: Navigare tra Dati XML

XPath fornisce un meccanismo per individuare specifici elementi e attributi all’interno di un documento XML. Permette di selezionare e filtrare i dati da trasformare o visualizzare. Esempio di query XPath:

/bookstore/book[price > 20]

Questa espressione seleziona tutti gli elementi <book> con un prezzo superiore a 20.

2. XSLT: Trasformare Dati XML

XSLT è il cuore del processo di presentazione dei dati XML. Si basa su fogli di stile contenenti regole di trasformazione che:

  • Identificano gli elementi da elaborare.
  • Definiscono come questi elementi devono essere rappresentati.

Un esempio di foglio di stile XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="book">
      <html>
         <body>
            <h2><xsl:value-of select="title"/></h2>
            <p><xsl:value-of select="author"/></p>
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

Questo foglio trasforma l’elemento <book> in un frammento HTML che presenta titolo e autore del libro.

3. XSL-FO: Gestione Avanzata della Formattazione

XSL-FO introduce tag specifici per definire la formattazione dettagliata dei dati. È particolarmente utile in ambiti di pubblicazione, ad esempio per la generazione di PDF. Esempio di utilizzo:

<fo:block font-size="12pt" text-align="center">
   Questo è un titolo centrato.
</fo:block>

Questo codice definisce un blocco di testo formattato con un font di 12pt e allineamento centrato.

Flessibilità di XSL

Uno dei punti di forza di XSL è la sua modularità. I tre linguaggi (XPath, XSLT e XSL-FO) non sono rigidamente legati tra loro e possono essere utilizzati separatamente in base alle necessità:

  • È possibile sostituire XPath con un linguaggio alternativo come XQL senza influire sulla presentazione.
  • Si può scegliere di omettere XSL-FO e generare direttamente HTML o XHTML per la visualizzazione web.

Questa flessibilità consente a XSL di adattarsi a un’ampia varietà di applicazioni e scenari.

Combinare XML con XSLT

La presentazione dei dati XML con XSL si basa su due componenti chiave:

  1. Foglio di Stile XSLT: Un documento che descrive come trasformare i dati XML in un formato presentabile.
  2. Processore XSLT: Un software che prende in input un documento XML e un foglio di stile XSLT, producendo in output il formato desiderato (XHTML, testo, XSL-FO, ecc.).

XPath: Espressioni e Funzioni

Introduzione a XPath

XPath (XML Path Language) è uno strumento essenziale per individuare elementi e attributi in un documento XML. Simile ai selettori CSS, ma molto più potente e flessibile, XPath permette di navigare nella struttura gerarchica di un documento XML utilizzando espressioni dichiarative compatte, dette espressioni XPath o pattern.

Grazie alla sua sintassi, che ricorda i percorsi file di un sistema operativo, XPath consente di localizzare e filtrare nodi dell’albero XML con estrema precisione.

Sintassi Base di XPath

La sintassi di XPath è progettata per navigare facilmente la struttura di un documento XML. Ecco le basi:

  1. Simbolo /: Rappresenta il root element (radice) del documento XML.
  2. Percorsi: Permettono di raggiungere nodi specifici a partire dalla radice o da un nodo corrente.

Esempio pratico con il seguente documento XML:

<?xml version="1.0" ?>
<articolo titolo="">
  <paragrafo titolo="Titolo del primo paragrafo">
    <testo>Blocco di testo del primo paragrafo</testo>
    <immagine file="immagine1.jpg" />
  </paragrafo>
  <paragrafo titolo="Titolo del secondo paragrafo">
    <testo>Blocco di testo del secondo paragrafo</testo>
    <codice>Esempio di codice</codice>
    <testo>Altro blocco di testo</testo>
  </paragrafo>
</articolo>

Esempi di Percorsi in XPath

Elemento root: / rappresenta l’intero elemento radice del documento, in questo caso <articolo>.

Elemento specifico: Per selezionare tutti gli elementi <testo>:

/articolo/paragrafo/testo

Attributo di un elemento: Per selezionare l’attributo titolo degli elementi <paragrafo>:

<code>/articolo/paragrafo/@titolo</code>

Elemento con condizione: Per trovare il paragrafo con titolo="Titolo del secondo paragrafo":

/articolo/paragrafo[@titolo="Titolo del secondo paragrafo"]

Funzioni Utili in XPath

XPath dispone di diverse funzioni predefinite per manipolare nodi ed eseguire calcoli. Eccone alcune delle più comuni:

Posizione e Sequenza

position(): Restituisce la posizione corrente di un elemento. Es.: per ottenere il secondo paragrafo:

/articolo/paragrafo[position()=2]

last(): Restituisce la posizione dell’ultimo elemento. Es.: per selezionare l’ultimo paragrafo:

/articolo/paragrafo[position()=last()]

Conteggio

count(): Conta il numero di nodi che corrispondono a un pattern. Es.: per contare tutti i paragrafi:

<code>count(//paragrafo)</code>

Manipolazione di Stringhe

concat(): Concatena stringhe. Es.:

concat("par", "agra", "fo") => "paragrafo"

substring(): Restituisce una sottostringa specifica. Es.:

substring("paragrafo", 5, 3) => "gra"

string-length(): Calcola la lunghezza di una stringa. Es.:

string-length("paragrafo") => 9

starts-with(): Verifica se una stringa inizia con un determinato prefisso. Es.:

starts-with("paragrafo", "par") => true

ends-with(): Controlla se una stringa termina con un determinato suffisso. Es.:

ends-with("paragrafo", "fo") => true

Manipolazione Numerica

  • number(): Converte un valore in un numero.
  • round(): Arrotonda un numero all’intero più vicino.
  • floor(): Restituisce l’intero inferiore più vicino.
  • ceiling(): Restituisce l’intero superiore più vicino.

Navigazione Relativa in XPath

XPath supporta percorsi relativi e assoluti, utili per contesti diversi:

  1. Nodo Corrente (.): Rappresenta il nodo attuale.
  2. Nodo Genitore (..): Rappresenta il genitore del nodo corrente.
  3. Tutti i Discendenti (//): Permette di selezionare tutti gli elementi figli e sotto-figli di un nodo specifico.

Esempi:

Tutti gli elementi <immagine> nei paragrafi:

/articolo/paragrafo//immagine

Tutti i sotto-elementi del secondo paragrafo:

/articolo/paragrafo[position()=2]/*

Potenza di XPath

Grazie alla sua ricca libreria di funzioni e alla capacità di gestire percorsi relativi e assoluti, XPath consente di costruire espressioni estremamente flessibili e potenti per analizzare e navigare documenti XML. Questo lo rende uno strumento imprescindibile per la presentazione dei dati con tecnologie come XSLT.

Esistono strumenti per verificare la correttezza di una espressione/query XPath , che in inglese prendono il nome di tester o evaluator .

Alcuni siti Web consentono di caricare e/o copiare e incollare documenti XML e di immettere e valutare una stringa XPath:

Elaborazione dei Documenti XML: I Parser

Cos’è il Parsing di un Documento XML?

Il parsing è un’operazione fondamentale nell’elaborazione dei documenti XML. Questo processo consiste nel costruire l’albero sintattico associato al documento, verificandone eventualmente la conformità allo schema XML specificato.

Durante il parsing, il documento XML viene analizzato nella sua interezza: ogni parte viene letta ed elaborata per estrarre i dati necessari e rappresentarli in una struttura organizzata. L’analisi avviene scandendo i simboli terminali del documento XML, aggregandoli in entità più complesse in base ai tag definiti dalle regole XML.

Approcci Principali al Parsing in Java: DOM e SAX

Esistono due approcci principali per il parsing dei documenti XML utilizzando Java:

1. SAX (Simple API for XML): Parser Basato su Eventi

SAX è un parser che analizza il documento XML tramite un modello a callback, eseguendo azioni specifiche ogni volta che individua un elemento o un attributo. Questo approccio offre diversi vantaggi:

  • Efficienza: SAX utilizza poche risorse, in quanto legge il documento XML sequenzialmente senza caricarlo interamente in memoria.
  • Supporto per Documenti Grandi: È ideale per elaborare documenti di grandi dimensioni che non possono essere contenuti nella memoria centrale.

Tuttavia, SAX presenta alcune limitazioni:

  • Non consente di navigare il documento al contrario.
  • Non permette di modificare o creare nuovi documenti XML.

2. DOM (Document Object Model): Parser Basato su Albero

DOM è un parser che legge l’intero documento XML e lo rappresenta in memoria come un albero di oggetti (parse tree). Ogni componente del documento XML (elementi, attributi, testo, ecc.) diventa un nodo della struttura.

Vantaggi del DOM:

  • Permette di navigare il documento in tutte le direzioni (in profondità o ampiezza).
  • Consente di modificare o creare nuovi documenti XML.
  • L’albero XML può essere manipolato dinamicamente: è possibile aggiungere, rimuovere o modificare nodi.

Limitazioni del DOM:

  • Richiede che l’intero documento XML sia caricato in memoria, rendendolo meno adatto per documenti di grandi dimensioni.

SAX vs DOM: Un Confronto

DOM e la Programmazione Object-Oriented

Il modello DOM è basato sui principi della programmazione orientata agli oggetti, rappresentando il documento XML come una struttura dinamica interamente caricata in memoria. Ogni elemento diventa un nodo dell’albero, e l’interfaccia org.w3c.dom.Node fornisce metodi per:

  • Navigare tra nodi figli, fratelli o genitori.
  • Modificare dinamicamente il contenuto del documento (aggiungere, rimuovere o aggiornare nodi).
  • Accedere alle proprietà degli elementi, come attributi o valori.

Esempi di navigazione in DOM includono:

  • Visite in ampiezza: esplorare i nodi livello per livello.
  • Visite in profondità: attraversare i nodi discendenti di un ramo specifico.

DOM è lo standard adottato dal W3C (World Wide Web Consortium) per la rappresentazione dei documenti XML e HTML.

Quando Usare SAX o DOM?

La scelta tra SAX e DOM dipende dal contesto e dalle esigenze applicative:

  • SAX è ideale per:
    • Documenti XML molto grandi.
    • Operazioni semplici di lettura e analisi lineare.
  • DOM è preferibile per:
    • Documenti di dimensioni moderate.
    • Necessità di modificare, creare o navigare il documento XML.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *