XML jest językiem, dużo więcej daje jednak spojrzenie na XML jako metajęzyk, to znaczy zbiór języków, zastosowań XML. Definiowanie zastosowania XML nazywa się zwykle definiowaniem struktury dokumentu.
Dopiero w kontekście konkretnego zastosowania XML odpowiednie elementy, atrybuty, fragmenty tekstu nabierają właściwego znaczenia. Oprócz określenia składni definiowanego języka (np. w DTD), należy też określić jego semantykę. Jest to znacznie trudniejsze do sformalizowania i pozostaje najczęściej opisaną słownie (lub nawet nie) umową.
Zalecane sposoby definiowania struktury dokumentu:
Każdy dokument XML musi być poprawny składniowo (well-formed) - być zgodny z gramatyką i spełniać well-formedness constraints wymienione w rekomendacji XML.
Oznacza to między innymi:
Dodatkowo dokument XML może być poprawny strukturalnie (valid) - być zgodny z definicją struktury (jeśli nie jest powiedziane inaczej, chodzi o DTD), spełniać validity constraints wymienione w rekomendacji XML (to one definiują tę "zgodność").
Definiowanie struktury dokumentu w DTD opiera się na założeniu, że w całym dokumencie elementy o tej samej nazwie mają podobną strukturę. DTD definiuje typy elementów, elementami tego samego typu są elementy o tej samej nazwie.
DTD pozwala zdefiniować takie własności dokumentu:
Deklaracja DTD w dokumencie występuje za deklaracją XML (jeśli istnieje) a przed elementem głównym. Może w całości być zawarta w dokumencie, może być zawarta w encji zewnętrznej, lub częściowo być w encji zewnętrznej, a częściowo w dokumencie - w tym przypadku jako pierwsza przetwarzana jest część wewnętrzna. Przykłady:
<?xml version="1.0"?> <!DOCTYPE greeting SYSTEM "hello.dtd"> <greeting>Hello, world!</greeting>
<?xml version="1.0"?> <!DOCTYPE greeting PUBLIC "-//W3C//GREETEING 1.0//EN" "hello.dtd"> <greeting>Hello, world!</greeting>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE greeting [ <!ELEMENT greeting (#PCDATA)> ]> <greeting>Hello, world!</greeting>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE greeting SYSTEM "hello.dtd" [ <!ATTLIST greeting words CDATA #IMPLIED> ]> <greeting words="2">Hello, world!</greeting>
DTD zawiera deklaracje elementów i list atrybutów (a także encji i notacji).
Deklaracja elementu:
<!ELEMENT nazwa-elementu typ-zawartości-elementu >.
Dla każdej nazwy elementu może istnieć tylko jedna jego deklaracja w DTD.
Typy zawartości elementu:
Deklaracja listy atrybutów:
<!ATTLIST nazwa-elementu
nazwa-atrybutu1 typ-zawartości-atrybutu1 opis-domyślnego1
nazwa-atrybutu2 typ-zawartości-atrybutu2 opis-domyślnego2
...
>
Dla każdego elementu może być wiele list atrybutów, dla każdego atrybutu może być w sumie wiele deklaracji - liczy się pierwsza.
Typy zawartości atrybutu:
Pod Linuksem działa program xmllint, walidujący dokumenty XML.
Następujące wywołanie:
xmllint --valid -noout plik.xml
sprawdzi poprawność pliku nie wypisując go na ekran.
Do walidowania dokumentów XML można też wykorzystać program przykładowy wchodzący w skład Xalana.
Kompiluje się go poleceniem:
javac Validate.java.
Aby sprawdzić poprawność strukturalną (a przy okazji też składniową) pliku plik.xml należy wywołać:
java Validate plik.xml