XML è un meta-linguaggio, cioè un linguaggio che serve per definire altri linguaggi. Nasce per porre rimedio ai limiti dell'HTML, in cui abbiamo un numero limitato di tag e quindi di tipi di informazioni che possiamo descrivere.

Se un documento rispetta le regole sintattiche si dice ben formato, o well-formed. Se rispetta le regole di validità (che sono opzionali) si dice valido. Un documento ben formato può non essere valido, mentre un documento valido è anche necessariamente ben formato.

Un documento XML è formato da un prologo ed un contenuto. Nel prologo troviamo l'indicazione della versione del linguaggio, la codifica e opzionalmente l'indicazione di un DTD, cioè un file con estensione .dtd contenente le regole di validità. Infine può esserci un link ad un foglio di stile.

La terminologia per descrivere un albero XML prende il nome di XPath data model. Ogni albero inizia con un nodo radice che contiene tutti gli altri nodi, che possono essere nodi elemento, nodi commento, nodi attributo o nodi istruzione.

I nodi elemento definiscono il ruolo dell'informazione rappresentata, possono contenere lettere, numeri e altri caratteri ma il primo carattere deve essere una lettera (tranne ovviamente la combinazione di lettere x, m e l).

I nodi testo corrispondono ad un frammento dell'informazione, non hanno figli, sono le foglie dell'albero.

I nodi attributo sono inseriti dentro il tag di inizio e forniscono informazioni in più sul nodo elemento. 

I nodi commento sono meta-informazioni a beneficio solo dei lettori umani, vengono ignorati dalla maggior parte degli strumenti.

I nodi istruzione trasmettono informazioni agli strumenti che operano sul documento XML, sono caratterizzati da un target (che indica lo strumento a cui sono rivolte) e un valore (l'informazione vera e propria che lo strumento processerà).

Quando si uniscono o si confrontano due file potrebbe verificarsi una collisione di nomi, si può risolvere ponendo davanti all'elemento che si vuole differenziare un diverso prefisso, quindi nel tag di apertura posso scrivere xmlns:prefix="URI" dove le lettere "ns" stanno per "namespace" e come "URI" si intende l'url di un documento che ci fornisce il contesto di quel namespace. Spesso i namespaces si indicano nel nodo radice e negli elementi si mettono solo i prefissi.

Per validare un documento XML si utilizza il linguaggio schema DTD Document Type Definition. In un file .dtd si possono indicare quali elementi possono essere contenuti in altri elementi, quali attributi e con che valori, quali entità (cioè frammenti di documento che sono riutilizzabili e memorizzati separatamente).

La sintassi è la seguente:

<!ELEMENT nomeElemento (elementi figli consentiti) occorrenza>

Come occorrenza si può indicare il simbolo + per indicare che l'elemento è obbligatorio e può ripetersi più volte, il simbolo * per indicare che l'elemento è facoltativo e può ripetersi più volte e il simbolo ? per indicare che l'elemento è facoltativo e può comparire una sola volta. Se non viene specificata l'occorrenza significa che l'elemento è obbligatorio e non può ripetersi più volte.

Per indicare che l'elemento contiene direttamente i dati e non contiene altri elementi figli si usa la seguente forma:

<! ELEMENT nomeElemento (#PCDATA)>

Per indicare gli attributi che un elemento può avere usiamo questa sintassi:

<!ATTLIST nomeElemento definizioni>

dove definizioni è una lista di definizioni di attributo, ciascuno nella forma nome attributo + tipo (CDATA per indicare che è una stringa e che può avere qualsiasi valore, oppure s1 | s2 | sn per indicare che è una stringa e che può avere solo uno dei valori s1, s2, ecc..., ID per indicare che il valore deve essere unico in tuto il documento) + default (se l'attributo è opzionale, richiesto ed eventualmente il suo valore predefinito, usiamo #REQUIRED per indicare che il valore deve essere specificato e non c'è un default, #IMPLIED per indicare che il valore è facoltativo, #FIXED "valoreX" per indicare che l'attributo può avere come valore solo "valoreX")