1. Introduzione all'XML
Anche se oggi JSON è lo standard, nel mondo Java c'è ancora molto codice legacy, quindi a volte potresti imbatterti in XML. Dunque è utile averne un'idea. XML (eXtensible Markup Language) — è un formato testuale per l'archiviazione e lo scambio di dati strutturati. È spesso utilizzato per configurazioni, scambio tra programmi, memorizzazione dei dati e persino per la serializzazione degli oggetti.
Elementi principali della struttura di un documento XML:
Tag (elementi):
Tutto ciò che si trova tra < e >. Ogni tag si apre (<tag>) e si chiude (</tag>), oppure è autochiudente (<tag/>).
Attributi:
Parametri aggiuntivi all'interno del tag.
Esempio: <user name="Vasya" age="25"/>
Nodi di testo:
Testo tra i tag.
Esempio: <greeting>Ciao, mondo!</greeting>
Esempio di un semplice documento XML
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user name="Vasya" age="25">Ciao!</user>
<user name="Katya" age="30"/>
</users>
Qui:
- <users> — elemento radice.
- <user> — elemento con gli attributi name e age; il primo utente ha contenuto testuale.
2. Concetti chiave
Prologo:
La riga all'inizio del file indica la versione di XML e la codifica.
Esempio: <?xml version="1.0" encoding="UTF-8"?>
Elementi:
I mattoni fondamentali di XML.
Esempio: <book>...</book>
Attributi:
Parametri all'interno del tag di apertura.
Esempio: <book title="Java" author="Ivanov"/>
Commenti:
Come in HTML, si scrivono tra <!-- ... -->.
Esempio: <!-- Questo è un commento -->
Sezioni CDATA:
Consentono di inserire testo che non venga interpretato come XML (ad esempio con i simboli <, & ecc.).
Esempio:
<script><![CDATA[
if (a < b && b > 0) { ... }
]]></script>
3. Perché servono i namespace in XML
Problema: conflitto di nomi
Nei grandi documenti XML spesso compaiono nomi di tag identici ma con significati diversi. Per esempio, hai <table> come parte di HTML e <table> come parte della tua logica di business (ad esempio, un database). Come capire quale tag significa cosa?
Senza namespace:
<root>
<table>
<row>...</row>
</table>
<table>
<column>...</column>
</table>
</root>
Qui non è chiaro a cosa si riferisca ciascun <table>.
Soluzione: namespace
Namespace (spazio dei nomi) — è un modo per «etichettare» elementi e attributi, così da evitare conflitti di nomi e separare chiaramente il significato dei vari tag.
- Ogni namespace è un URI univoco (di solito sembra un link, ma è solo un identificatore).
- Elementi e attributi con namespace diversi sono considerati differenti, anche se il nome coincide.
Vantaggi:
- Nessun conflitto di nomi tra standard e schemi diversi.
- Possibilità di unire dati da fonti diverse in un unico documento.
- Si vede chiaramente a quale «vocabolario» appartiene ogni tag.
4. Uso dei namespace: dichiarazione e applicazione
Come dichiarare un namespace
Nel tag di apertura di un elemento si usa un attributo speciale xmlns (XML Namespace):
- Senza prefisso: xmlns="URI" — dichiara il namespace predefinito per tutti gli elementi annidati.
- Con prefisso: xmlns:prefix="URI" — dichiara un namespace con un nome corto (prefisso) da usare nei tag.
Esempio di dichiarazione e utilizzo del namespace
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Cella 1</h:td>
<h:td>Cella 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Tavolo</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Qui:
- xmlns:h="..." — dichiara il prefisso h per la tabella HTML.
- xmlns:f="..." — dichiara il prefisso f per i mobili.
- <h:table> e <f:table> — ora sono elementi diversi, anche se il nome è lo stesso.
Come usare un namespace
- Dichiarazione: nell'elemento radice o in qualsiasi altro: xmlns:prefix="URI"
- Applicazione: prima del nome dell'elemento o dell'attributo si scrive il prefisso e i due punti: <prefix:element>...</prefix:element>
Namespace predefinito
Se si dichiara semplicemente xmlns="URI", tutti gli elementi senza prefisso apparterranno a quel namespace.
<books xmlns="http://example.com/books">
<book>...</book>
</books>
5. Pratica: creazione di un semplice documento XML con più namespace
Creiamo un esempio di documento XML che usa due namespace: per HTML e per i mobili.
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Cella 1</h:td>
<h:td>Cella 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Tavolo</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Cosa succede qui:
- Nell'elemento radice sono dichiarati due namespace: h e f.
- Tutti gli elementi con prefisso h: appartengono alla tabella HTML.
- Tutti gli elementi con prefisso f: appartengono ai mobili.
6. Errori tipici
Errore 1: prefisso non dichiarato
<root>
<h:table>...</h:table>
</root>
Risultato: Il parser XML genererà un errore: The prefix 'h' for element 'h:table' is not bound.
Errore 2: nomi identici senza namespace
<root>
<table>...</table>
<table>...</table>
</root>
Risultato: Impossibile distinguere a cosa si riferisca ciascun <table>.
Errore 3: uso errato del prefisso
<root xmlns:h="http://www.w3.org/TR/html4/">
<h:table>...</h:table>
<f:table>...</f:table> <!-- Errore: il prefisso f non è dichiarato -->
</root>
Risultato: Errore del parser: The prefix 'f' for element 'f:table' is not bound.
GO TO FULL VERSION