Dokument XML, jako dokument poprawny strukturalnie powinien być wyposażony w formalny opis jego części składowych (nie jest to konieczne ale zalecane). Taki opis w dużej mierze pozwala na uzyskanie pełnej kontroli nad powstającymi w oparciu o niego, wypełnionym treścia egzemplarzami dokumenu (instancjami dokumentu). Klasyfikacja dokumentów pod względem typów, ułatwia też ich przetważanie.
Obecnie wzorce struktur, opisujące typy dokumentów możemy definiować na dwa sposoby: używając odziedziczonego po SGML'u mechanizmu określanego jako DTD (Document Type Definition) lub nowszego, rozszerzającego możliwości DTD zapisu XML Schema.

DTD:

Składnia:

<!ELEMENT nazwa (model_zawartości)> - wzorzec definicji elementu;

model_zawartości:

Oznaczenieinformacja
*0 lub wiecej wystąpień
+1 lub wiecej wystąpień
?0 lub 1 wystąpienie
,sekwencja
|alternatywa
- oznaczenia stosowane w modelu zawartości

#PCDATA - zawartość tekstowa
EMPTY - barak dalszego rozbicia struktury i brak zawartości znakowej
ANY - zawartość dowolna

<!ATTLIST nazwa_elementu typ_atrybutu kwalifikator_wartości wartość_domyślna>

typ_atrybutu:

ID -unikatowa (w ramach dokumentu) wartość identyfikatora
IDREF - wskaźnik do innego elementu (identyfikowanego z wykorzystaniem atrybutu rypu ID)
NMTOKEN - ciąg dozwolonych znaków
NMTOKENS - ciag wartości NMTOKEN oddzielonych spacjami
(a | b | c) - jedna z podanych watości

kwalifikator_wartości:

#REQUIRED - wartość wymagana, musi zostać podana
#IMPLIED - wartość nie musi zostać podana
#FIXED - wartość stała

Przykład:

<!ELEMENT ARTYKUL (TYTUL, TRESC)>
<!ELEMENT TYTUL   (EMPTY)>
<!ELEMENT TRESC   (EMPTY)>

<!ELEMENT ARTYKUL (TYTUL, TRESC)>
<!ELEMENT TYTUL   (#PCDATA)>
<!ELEMENT TRESC   (#PCDATA)>

<!ELEMENT ARTYKUL (TYTUL, TRESC)>
<!ATTLIST ARTYKUL
           dataPubl    NMTOKEN  #REQUIERD
           autor       ID       #REQUIERD>
<!ELEMENT TYTUL   (#PCDATA)>
<!ELEMENT TRESC   (#PCDATA)>


<!KSIAZKA (AUTOR, TYTUL, TRESC, OPIS, OPINIE)>
<!AUTOR (IMIE, NAZWISKO, EMAIL, OPISDZIALALNOSCI)>
...
<!ELEMENT OPINIE (OPINIA | ODNOSNIK)*>
Związanie DTD z instancją dokumentu, wymaga poprzedzenia jej deklaracja DOCTYPE. Deklaracja taka zawiera wskazanie elementu głównego (root element), stanowiącego korzeń dzewa struktury oraz właściwą definicję struktury, lub odwołanie do zawierającej ja encji zewnętrznej:
<!DOCTYPE ARTYKUL PUBLIC "-" "">


XML Schema:

Do definicji typu dokumentu wykorzystuje się tu standardową składnie XML, a dla uniknięcia konfliktów nazw, składniki definicji należą do przestrzeni nazw XML Schema, wyróżnionej zywkle prefiksem xsd. Definicja dokumentu zawarta jest w elemencie głównym xsd:schema, zaś odpowiednikami deklaracji elementów i atrybutów z DTD są elementy xsd:element i xsd:attribute

xsd:element:

prosty (simple type):

Definiuje zbiory wartości atomowych (typy wbudowane: string, boolean, integer, float, dateTime (w postaci 2001-01-03T12:56)).

<xsd:element name="NAZWISKO"
             type="xsd:string">
złożony (complex type):

Są to definicje modeli zawartości xsd:sequence (tworzy sekwencje wystąpień elementów), xsd:choice (alternatywa elementów), xsd:group (grupowanie elementów). Do okreslenia liczby wystąpień elementów używane są atrybuty minOccurs i maxOccurs, przyjmujące wartości całkowite oraz wartość unbound, oznaczając nieograniczona liczbę wystąpień. Kontrola użycia atrybutów realizowana jest przy pomocy atrybutu use o wartościach: requierd, optional oraz prohibited.


<xsd:schema>
  <xsd:element name="ARTYKUL" type="modelArtykulu">

  <xsd:complexType name="modelArtykulu">
    <xsd:sequence>
      <xsd:element ref="TYTUL"
                   minOccurs="1"
                   maxOccurs="1"/>
      <xsd:element ref="TRESC"
                   minOccurs="1"
                   maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="dataPubl"
                   type="xsd:date"/>
    <xsd:attribute name="autor"
                   type="xsd:string"/>
  </xsd:complexType>
  <xsd:element name="TYTUL"
               type="xsd:string"/>
  <xsd:slement name="TRESC"
               type="xsd:string/">
</xsd:schema>

wlasne typy danych:

Możemy tworzyć własne typy danych na podstawie typów prostych, narzucając z góry pewne aspekty:
minInclusive, maxInclusive, minExlusive, maxExlusive - ograniczenie wartości liczbowych, włączając lub wyłączając wartości brzegowe
pattern - wzorzec wartości zgodny z podanym wyrażeniem regularnym
enumeration - ogranicza typ do wartości wyliczeniowych
list - listy wartości typu prostego
length, minLength, maxLength - wymagana, minimalna, maksymalna dlugość napisu
<xsd:simpleType name="prawdopodobienstwo">
  <xsd:restriction base="xsd:float">
    <xsd:minInclusive value="0"/>
    <xsd:maxInclusive value="1"/>
  </xsd:restriction>
<xsd:simpleType>

<xsd:simpleType name="kodPocztowy">
  <xsd:restriction base="xsd:string">
    <xsd:pattern value="\d{2}-\d{3}"/>
  </xsd:restriction>
</xsd:simpleType>

Narzedzia:

XSV (XML Schema Validator)
Xerces
XML Spy