CodeGym /Corsi /JAVA 25 SELF /Fondamenti di XML e namespace

Fondamenti di XML e namespace

JAVA 25 SELF
Livello 47 , Lezione 0
Disponibile

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.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION