Elements en un DTD

La declaració d’elements en un DTD defineix què pot contindre cada element d’un document XML.

1 Sintaxi general


<!ELEMENT nom_element tipus_contingut >

On:

  • !ELEMENT : Declaració de marca per a definir un element.
  • nom_element : Nom de l’element que estem definint.
  • tipus_contingut : Tipus de contingut permés dins de l’element.
  • Exemple:
<!ELEMENT receta (titulo, ingredientes, procedimiento)>

Això significa que <receta> ha de contindre exactament i en aquest ordre tres subelements: <titulo>, <ingredientes> i <procedimiento>.

  • Exemple XML vàlid
<receta>
  <titulo>Pizza</titulo>
  <ingredientes>Farina, tomaca, formatge...</ingredientes>
  <procedimiento>Pastar, enfornar i servir.</procedimiento>
</receta>
  • Exemple XML invàlid

En aquest cas hem afegit un element <parrafo> que no està declarat al DTD:

<receta>
  <parrafo>Això és un paràgraf</parrafo>
  <titulo>Pizza</titulo>
  <ingredientes>Farina, tomaca, formatge...</ingredientes>
  <procedimiento>Pastar, enfornar i servir.</procedimiento>
</receta>

Açò provocaria que el document fora no vàlid encara que estiga ben format.


Important…

  • El DTD és rigorós: si definim un element amb una seqüència concreta, no podem canviar l’ordre ni afegir elements no previstos.
  • Si volem flexibilitat (opcions o repeticions), cal utilitzar models de contingut amb operadors (|, ?, *, +) que es veuran en l’apartat següent.
  • És recomanable que els noms dels elements siguen autoexplicatius, per a millorar la claredat dels documents XML.

2. Tipus de contingut dels elements

En un DTD, el tipus de contingut especifica què pot aparéixer dins d’un element. Podem distingir diversos casos:


1.- Text

S’indica amb #PCDATA (Parsed Character Data). Vol dir que l’element només pot contindre text lliure, sense subelements.

<!ELEMENT cotxe (#PCDATA)>

Exemple XML vàlid:

<cotxe>Toyota Corolla</cotxe>

2. EMPTY (Buit)

L’element no pot tindre contingut, però sí pot tindre atributs. S’utilitza per a elements que actuen com a marques de posició o senyals.

<!ELEMENT linia_de_separacio EMPTY>

Exemple XML:

<linia_de_separacio/>

3. ANY

L’element pot contindre qualsevol cosa: text, subelements o una combinació. No és habitual fer-lo servir perquè trenca la validació estricta.

<!ELEMENT batiburrillo ANY>

4. contingut mixt (Mixed)

Barreja de text i subelements. La sintaxi ha d’incloure sempre #PCDATA i utilitzar | i *.

<!ELEMENT parrafo (#PCDATA | enfasis)*>
<!ELEMENT enfasis (#PCDATA)>

Exemple XML vàlid:

<parrafo>
  Aquest és un text amb <enfasis>paraules destacades</enfasis> dins.
</parrafo>

Nota: En DTD, en contingut mixt no es poden usar comes (,) ni quantificadors diferents de *.


5. Tipus element (subelements concrets)

L’element només pot contindre els subelements que indiquem al model de contingut, en un ordre determinat.

<!ELEMENT article (titol, autor, contingut)>

Exemple XML vàlid:

<article>
  <titol>Notícies d’avui</titol>
  <autor>Maria Pérez</autor>
  <contingut>El text de la notícia...</contingut>
</article>

Exemple invàlid (ordre incorrecte):

<article>
  <autor>Maria Pérez</autor>
  <titol>Notícies d’avui</titol>
  <contingut>El text de la notícia...</contingut>
</article>

Resum:

Tipus Definició Exemple DTD Exemple XML vàlid  
#PCDATA Només text <!ELEMENT cotxe (#PCDATA)> <cotxe>Toyota Corolla</cotxe>  
EMPTY Sense contingut (però amb atributs) <!ELEMENT linia_de_separacio EMPTY> <linia_de_separacio/>  
ANY Qualsevol contingut <!ELEMENT batiburrillo ANY> <batiburrillo>Qualsevol</batiburrillo>  
Mixt Text + subelements, en qualsevol ordre <!ELEMENT parrafo (#PCDATA | enfasis)*> <parrafo>text <enfasis>x</enfasis></parrafo>  
Element Seqüència de subelements concrets <!ELEMENT article (titol, autor, contingut)> <article><titol>...</titol>...</article>  

3. Models de contingut

Els models de contingut especifiquen com s’organitzen els subelements dins d’un element. En un DTD podem indicar seqüències, opcions i combinar-les amb quantificadors.


1.- Element simple

L’element pot contindre només un subelement.

<!ELEMENT aviso (parrafo)>

Exemple vàlid:

<aviso>
  <parrafo>Aquest és un avís.</parrafo>
</aviso>

Exemple invàlid (faltaria <parrafo>):

<aviso>Text directe</aviso>

2.- Seqüència

S’usa la coma ( , ) per indicar que els subelements han d’aparéixer en eixe ordre.

<!ELEMENT aviso (titulo, parrafo)>

Exemple vàlid:

<aviso>
  <titulo>Important</titulo>
  <parrafo>Això és un avís seqüenciat.</parrafo>
</aviso>

Exemple invàlid (canvi d’ordre):

<aviso>
  <parrafo>Això no és vàlid.</parrafo>
  <titulo>Important</titulo>
</aviso>

3.- Opció (alternatives)

S’usa la barra vertical ( | ) per indicar que es pot triar un dels elements.

<!ELEMENT aviso (parrafo | grafico)>

Exemple amb <parrafo>:

<aviso>
  <parrafo>Avís escrit.</parrafo>
</aviso>

Exemple amb <grafico>:

<aviso>
  <grafico>imatge.png</grafico>
</aviso>

Exemple invàlid (apareixen els dos a la vegada):

<aviso>
  <parrafo>Avís escrit.</parrafo>
  <grafico>imatge.png</grafico>
</aviso>

4.- Combinació amb agrupacions

Podem usar parèntesis per combinar seqüències i opcions.

<!ELEMENT aviso (titulo, (parrafo | grafico))>

Interpretació: <aviso> ha de contindre un <titulo> seguit de un <parrafo> o un <grafico>.

Exemple vàlid:

<aviso>
  <titulo>Avís</titulo>
  <parrafo>Text de l’avís</parrafo>
</aviso>

5.- Quantificadors

  • ? → 0 o 1 vegada.
  • * → 0 o més vegades.
  • + → 1 o més vegades.

4. Quantificadors

Els quantificadors permeten indicar quantes vegades pot aparéixer un element dins d’un model de contingut.

Els quantificadors més comuns són:

  • ?Zero o una vegada (opcional).

    <!ELEMENT subtitol (parrafo?)>
    

    Exemple XML vàlid:

      <subtitol/>
    
      <subtitol>
          <parrafo>Un subtítol curt</parrafo>
      </subtitol>
    
  • *Zero o més vegades.

    <!ELEMENT llista (element*)>
    

    Exemple XML vàlid:

    <llista/>
    
    <llista>
      <element>A</element>
      <element>B</element>
    </llista>
    
  • +Una o més vegades (mínim una).

<!ELEMENT paragrafs (parrafo+)>

Exemple XML vàlid:

  <paragrafs>
    <parrafo>Primer</parrafo>
   </paragrafs>
  <paragrafs>
    <parrafo>Un</parrafo>
    <parrafo>Dos</parrafo>
  </paragrafs>

Exemple combinat:

<!ELEMENT aviso (titulo?, (parrafo+, grafico))>

Interpretació:

  • <titulo> → pot aparéixer 0 o 1 vegada.
  • <parrafo> → ha d’aparéixer almenys una vegada.
  • <grafico> → ha d’aparéixer exactament una vegada, i sempre després dels paràgrafs.

Exemples XML vàlids:

<aviso>
  <parrafo>Primer avís</parrafo>
  <grafico>imatge.png</grafico>
</aviso>
<aviso>
  <titulo>Important</titulo>
  <parrafo>Detall 1</parrafo>
  <parrafo>Detall 2</parrafo>
  <grafico>diagrama.png</grafico>
</aviso>

Exemple XML invàlid (perquè falta <grafico>):

<aviso>
  <titulo>Error</titulo>
  <parrafo>No hi ha gràfic</parrafo>
</aviso>

Taula resum de models de contingut

Model DTD Significat Exemple XML vàlid  
(A,B) Seqüència: A seguit de B <x><A/><B/></x>  
`(A | B)` Opció: A o B <x><A/></x> o <x><B/></x>  
A? Opcional: 0 o 1 A <x/> o <x><A/></x>  
A* 0 o més vegades <x/>, <x><A/><A/></x>  
A+ 1 o més vegades <x><A/></x>, <x><A/><A/></x>  
(titulo?, (parrafo+, grafico)) Opcional <titulo>, 1+ <parrafo>, 1 <grafico> <aviso><parrafo/>…<grafico/></aviso>  

Resum i exemples pràctics

Els elements són la base del DTD i permeten definir quines etiquetes poden aparéixer, en quin ordre i amb quina cardinalitat.

Tipus de definició

Sintaxi Significat
<!ELEMENT nom (subelements)> Defineix l’element i els subelements que pot contindre.
#PCDATA Text lliure dins d’un element.
EMPTY Element buit (sense contingut).
ANY Pot contindre qualsevol cosa (altres elements o text).

Quantificadors principals

Quantificador Significat
? Zero o una vegada (opcional).
* Zero o més vegades.
+ Una o més vegades.

Exemples pràctics

1. Elements obligatoris

<!ELEMENT article (titol, autor, contingut)>
<!ELEMENT titol (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT contingut (#PCDATA)>

Cada <article> ha de tindre exactament un <titol>, un <autor> i un <contingut>.

XML vàlid:

<article>
  <titol>Notícia d’avui</titol>
  <autor>Maria Pérez</autor>
  <contingut>Text complet de la notícia.</contingut>
</article>

XML invàlid (falta <autor>):

<article>
  <titol>Notícia d’avui</titol>
  <contingut>Text complet de la notícia.</contingut>
</article>

2. Ús de quantificadors

<!ELEMENT revista (article+)>
<!ELEMENT article (titol, autor?, contingut+)>
<!ELEMENT titol (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT contingut (#PCDATA)>
  • Una <revista> ha de tindre almenys un <article>.
  • L’<autor> és opcional.
  • El <contingut> ha d’aparéixer almenys una vegada.

XML vàlid:

<revista>
  <article>
    <titol>Entrevista</titol>
    <contingut>Primera part</contingut>
    <contingut>Segona part</contingut>
  </article>
</revista>

XML invàlid (sense <contingut>):

<revista>
  <article>
    <titol>Entrevista</titol>
  </article>
</revista>

3. Exemple amb múltiples llibres

<!ELEMENT biblioteca (llibre*)>
<!ELEMENT llibre (titol, autor, any)>
<!ELEMENT titol (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT any (#PCDATA)>

Una <biblioteca> pot tindre cap o molts <llibre>. Cada <llibre> ha de contindre un <titol>, un <autor> i un <any>.

XML vàlid:

<biblioteca>
  <llibre>
    <titol>1984</titol>
    <autor>George Orwell</autor>
    <any>1949</any>
  </llibre>
  <llibre>
    <titol>Crim i càstig</titol>
    <autor>Fiódor Dostoievski</autor>
    <any>1866</any>
  </llibre>
</biblioteca>

XML invàlid (falta <any>):

<biblioteca>
  <llibre>
    <titol>1984</titol>
    <autor>George Orwell</autor>
  </llibre>
</biblioteca>

4. Exemple relacionat amb l’exemple inicial (llibres)

<!ELEMENT llibres (llibre+)>
<!ELEMENT llibre (titol, autor, publicacio)>
<!ELEMENT titol (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT publicacio (#PCDATA)>

XML vàlid segons este DTD:

<llibres>
  <llibre>
    <titol>El Arte de la Guerra</titol>
    <autor>Sun Tzu</autor>
    <publicacio>200 a.C.</publicacio>
  </llibre>
</llibres>

XML invàlid (canvi d’ordre):

<llibres>
  <llibre>
    <autor>Sun Tzu</autor>
    <titol>El Arte de la Guerra</titol>
    <publicacio>200 a.C.</publicacio>
  </llibre>
</llibres>

5. Exemple amb ordre i opcionalitat

<!ELEMENT llibre (titol, publicacio, autor, editorial?)>
<!ELEMENT titol (#PCDATA)>
<!ELEMENT autor (#PCDATA)>
<!ELEMENT publicacio (#PCDATA)>
<!ELEMENT editorial (#PCDATA)>
  • L’ordre dels subelements és obligatori.
  • <editorial> és opcional.

XML vàlid (amb <editorial>):

<llibre>
  <titol>La plaça del Diamant</titol>
  <publicacio>1962</publicacio>
  <autor>Mercè Rodoreda</autor>
  <editorial>Club Editor</editorial>
</llibre>

XML vàlid (sense <editorial>):

<llibre>
  <titol>La plaça del Diamant</titol>
  <publicacio>1962</publicacio>
  <autor>Mercè Rodoreda</autor>
</llibre>

XML invàlid (ordre incorrecte):

<llibre>
  <titol>La plaça del Diamant</titol>
  <autor>Mercè Rodoreda</autor>
  <publicacio>1962</publicacio>
</llibre>

Conclusions

  • Els elements definixen l’estructura d’un XML.
  • Amb els quantificadors podem controlar opcionalitat i repeticions.
  • L’ordre dels subelements sempre importa.
  • El DTD només controla estructura, no tipus de dades.