Un document XML este valabil dacă are o definiție a tipului de document asociat (DTD) și documentul respectă limitele stabilite în acesta. DTD trebuie să fie specificat înainte de primul element din document. Numele specificat după cuvântul DOCTYPE trebuie să se potrivească cu numele elementului rădăcină.
Elementele care pot fi copii ai unui anumit element trebuie enumerate într-un model de conținut separate printr-o virgulă.
Dacă numele elementului din DTD este urmat de un asterisc [*], înseamnă că elementul poate fi prezent succesiv zero, de una sau de mai multe ori.
Dacă numele elementului din DTD este urmat de un plus [+], înseamnă că elementul poate fi prezent unul câte unul sau de mai multe ori.
Dacă un nume de element din DTD este urmat de un semn de întrebare [?], Aceasta înseamnă că elementul nu se poate produce zero sau o singură dată.
În acest exemplu, se folosește o combinație de [+ *?] Modificatori.
Utilizând [| ] putem preciza că trebuie să existe unul din mai multe elemente.
Textul poate fi prezent în document la același nivel cu elemente.
Un atribut de tip CDATA poate conține orice caractere dacă acestea îndeplinesc condițiile de corectitudine ale documentului. Atributul tipului NMTOKEN poate conține numai litere, numere, un punct [. ], o liniuță [-], o subliniere [_] și un colon [. ]. NMTOKENS poate conține aceleași caractere ca și Nmtoken, plus spații albe: caractere spațiu, transportul retur, linia de alimentare sau filelor.
Valoarea atributului ID poate conține numai caractere permise pentru tipul NMTOKEN și trebuie să înceapă cu o literă. Niciun tip de element nu poate avea mai mult de un atribut specific al ID-ului de tip. Valoarea atributului ID trebuie să fie unică între toate valorile tuturor atributelor de acest tip.
Valoarea atributului IDREF trebuie să se potrivească cu valoarea unui atribut al ID-ului conținut în document. Valoarea atributului IDREFS poate conține mai multe referințe la elementele cu atributul ID, separate prin caracterele spațiului alb.
DTD poate lista valorile admise pentru atribut.
Dacă atributul este opțional, se poate defini o valoare implicită, care se utilizează atunci când atributul lipsește.
Un element poate fi definit ca EMPTY. În acest caz, poate conține numai atribute și nu poate conține text.