Salta el contingut

DTD — Document Type Definition

Qué és un DTD?

Un DTD (Document Type Definition) és un conjunt de regles que defineix l'estructura i els continguts permesos en un document XML. Permet validar si un document XML compleix amb un format preestablert.

Un document XML és vàlid quan és ben format i compleix amb el DTD o l'esquema associat.

Ben format vs Vàlid

  • Ben format: compleix les regles sintàctiques d'XML (etiquetes tancades, un arrel únic, etc.)
  • Vàlid: ben format i compleix l'esquema de validació (DTD o XSD)

DTD intern

El DTD s'inclou dins del mateix document XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE alumne [
    <!ELEMENT alumne (nom, nota)>
    <!ELEMENT nom (#PCDATA)>
    <!ELEMENT nota (#PCDATA)>
]>
<alumne>
    <nom>Joan García</nom>
    <nota>8.5</nota>
</alumne>

DTD extern

El DTD es guarda en un fitxer .dtd separat:

persona.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persona SYSTEM "persona.dtd">
<persona>
    <nom>Maria López</nom>
    <edat>22</edat>
    <email>maria@exemple.com</email>
</persona>

persona.dtd:

<!ELEMENT persona (nom, edat, email?)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT edat (#PCDATA)>
<!ELEMENT email (#PCDATA)>

Definició d'elements

<!-- Sintaxi: <!ELEMENT nom_element (contingut)> -->

<!-- Element amb text -->
<!ELEMENT titol (#PCDATA)>

<!-- Element buit -->
<!ELEMENT separador EMPTY>

<!-- Element amb qualsevol contingut -->
<!ELEMENT nota ANY>

<!-- Seqüència: fills en ordre fix -->
<!ELEMENT persona (nom, cognoms, edat)>

<!-- Opció: un dels fills (|) -->
<!ELEMENT pagament (targeta | transferencia | efectiu)>

<!-- Combinació -->
<!ELEMENT factura (data, client, (producte | servei)+, total)>

Cardinalitat (quantificadors)

Símbol Significat Exemple
(res) Exactament 1 (nom)
? 0 o 1 (opcional) (email?)
* 0 o més (telefon*)
+ 1 o més (linia+)
<!ELEMENT persona (nom, cognoms, telefon*, email?, adreca?)>
<!ELEMENT comanda (client, linia+, total)>
<!ELEMENT cataleg (producte*)>

Definició d'atributs

<!-- Sintaxi: <!ATTLIST element atribut tipus default> -->

<!ATTLIST producte
    id       ID            #REQUIRED
    categoria CDATA        #IMPLIED
    actiu    (true|false)  "true"
    tipus    CDATA         #FIXED "producte"
>

Tipus d'atributs

Tipus Descripció
CDATA Text lliure
ID Identificador únic al document
IDREF Referència a un ID existent
IDREFS Múltiples IDREF separats per espais
NMTOKEN Token XML (sense espais)
(val1\|val2) Enumeració de valors permesos

Valors per defecte

Valor Significat
#REQUIRED Obligatori
#IMPLIED Opcional, sense valor per defecte
#FIXED "valor" Valor fix, no es pot canviar
"valor" Valor per defecte (opcional)

Exemple complet

<!-- biblioteca.dtd -->
<!ELEMENT biblioteca (llibre+)>
<!ELEMENT llibre (titol, autor+, editorial, any, genere, descripcio?)>
<!ELEMENT titol (#PCDATA)>
<!ELEMENT autor (nom, cognom)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT cognom (#PCDATA)>
<!ELEMENT editorial (#PCDATA)>
<!ELEMENT any (#PCDATA)>
<!ELEMENT genere (#PCDATA)>
<!ELEMENT descripcio (#PCDATA)>

<!ATTLIST llibre
    isbn     ID            #REQUIRED
    idioma   CDATA         "ca"
    disponible (si|no)    "si"
>
<!-- biblioteca.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE biblioteca SYSTEM "biblioteca.dtd">
<biblioteca>
    <llibre isbn="ISBN001" idioma="ca" disponible="si">
        <titol>Tirant lo Blanc</titol>
        <autor>
            <nom>Joanot</nom>
            <cognom>Martorell</cognom>
        </autor>
        <editorial>Edicions 62</editorial>
        <any>1490</any>
        <genere>Novel·la de cavalleria</genere>
    </llibre>
</biblioteca>

Limitacions del DTD

Malgrat ser útil per introduir la validació, el DTD té limitacions importants:

Limitació Descripció
No és XML El DTD té la seva pròpia sintaxi, no es pot processar com XML
Tipus de dades limitats Només CDATA, no pot validar números, dates, etc.
Namespaces No suporta espais de noms XML
Cardinalitat limitada No pot expressar "exactament 3" o "entre 2 i 5"
Extensions Difícil d'estendre o reutilitzar

Per a validació avançada, s'usa XML Schema (XSD).

Miniactivitat AC03738

Escriu el DTD per al document XML institut.xml que vas crear al RA1. Ha de validar: cicles, mòduls, nombre d'hores, codi de mòdul (atribut ID), grau (enumeració GM/GS).