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.