Saltar la navegación

6.2.1. Elementos

Se realiza mendiante la etiqueta !ELEMENT, la sintaxis es la siguiente

<!ELEMENT nombre_del_elemento tipo_de_contenido>

El nombre es el identificador que tendrá el elemento en el documento XML (hay que recordar que se distingue entre mayúsculas y minúsculas).

El tipo indica el funcionamiento del elemento, relativo al contenido que puede tener: EMPTY, (#PCDATA), ANY, un elemento concreto, secuencias de elementos, elementos opcionales, combinaciones de elementos, cardinalidad.

Empty

Significa que el elemento no podrá tener contenido alguno, es un elemento vacío (como la etiqueta br de las páginas web).

Ejemplo de definición de elemento vacío: <!ELEMENT br EMPTY > => <br />

<!DOCTYPE ejemplo [ <!ELEMENT ejemplo EMPTY> ]>
<ejemplo></ejemplo>
<ejemplo />
<ejemplo>Esto es un ejemplo</ejemplo> <!-- ERROR: contiene texto -->
<ejemplo><a></a></ejemplo> <!-- ERROR: contiene un elemento <a> -->

(#PCDATA)

Elemento de contenido textual que no contenga marcas (Parsed Character Data – Datos de Carácter Procesados):

<!ELEMENT nombre (#PCDATA)> => <nombre> Enrique </nombre>

<!DOCTYPE ejemplos [
<!ELEMENT ejemplos (ejemplo*) >
<!ELEMENT ejemplo (#PCDATA)>
]>
<ejemplos>
   <ejemplo />
   <ejemplo>Esto es un ejemplo</ejemplo>
   <ejemplo><a></a></ejemplo> <!-- ERROR: contiene un elemento <a> -->
</ejemplos>

ANY

Elementos que pueden tener cualquier tipo de contenido, se puede utilizar para dejar la descripción de un elemento como válida en cualquier caso, eliminando cualquier comprobación sintáctica, no debería de aparecer en una versión definitiva del DTD:

<?xml version="1.0"?>
<!DOCTYPE persona [
<!ELEMENT persona (nombre, apellido)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellido ANY>
]>
<persona>
   <nombre>Enrique</nombre>
   <apellido> Rivas
      <nombre>Enrique</nombre>
   </apellido>
</persona>

Elemento Concreto

En los elementos se puede indicar claramente un contenido concreto para el mismo. Dicho contenido se indica entre paréntesis. Ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persona [
<!ELEMENT persona (nombre)>
<!ELEMENT nombre (#PCDATA)>
]>
<persona>
   <nombre>Juan</nombre>
</persona>

En el ejemplo dentro de una etiqueta persona obligatoriamente debe de existir una etiqueta nombre (una y sólo una).

No sólo se pueden indicar nombres de elementos como contenido concreto, la indicación #PCDATA significa que el elemento podrá contener texto literal (tan largo como se desee).

Secuencia de elementos

En el caso de indicar una lista de elementos separados por comas, por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persona [
<!ELEMENT persona (nombre, apellidos, edad)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT edad (#PCDATA)>
]>
<persona>
   <nombre>Antonio</nombre>
   <apellidos>Pérez</apellidos>
   <edad>35</edad>
</persona>

Indica que el elemento contendrá la lista de elementos indicada, la cual deberá estar en el mismo orden de la secuencia. Es decir en el ejemplo los apellidos no se podrían poner delante del nombre.

Elementos opcionales

Los elementos pueden contener elementos opcionales (puede aparecer uno u otro). Ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE artículo [
<!ELEMENT artículo (id | serie)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT serie (#PCDATA)>
]>
<artículo>
   <id>16</id>
</artículo>

La barra vertical indica que el elemento puede contener una u otra opción (pero sólo una) En el caso anterior aparece <id>, también sería válido

<artículo>
   <serie>A345H</serie>
</artículo>

Sin embargo los siguientes tienen error:

<artículo>
<id>16</id>
<serie>A345H</serie>
</artículo> <!-- ERROR: están los dos elementos --> <artículo></artículo> <!-- ERROR: no hay ningún elemento -->

Combinaciones de elementos

Por supuesto puede haber combinaciones, si tenemos un documento DTD llamado coordenada.dtd con este contenido:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT coordenada ((longitud, latitud) | coordUniversal)>
<!ELEMENT longitud (#PCDATA) >
<!ELEMENT latitud (#PCDATA) >
<!ELEMENT coordUniversal (#PCDATA) >

Sería válido este documento:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE coordenada SYSTEM "coordenada.dtd">
<coordenada>
   <longitud>234</longitud>
   <latitud>-23</latitud>
</coordenada>

Sería válido también:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE coordenada SYSTEM "coordenada.dtd">
<coordenada>
<coordUniversal>1232332</coordUniversal>
</coordenada>

Otro ejemplo:

<!DOCTYPE ejemplo [
<!ELEMENT ejemplo ((a, b)|(b, a))>
<!ELEMENT a EMPTY>
<!ELEMENT b EMPTY>
]>
<ejemplo><a /><b /></ejemplo>
<ejemplo><b /><a /></ejemplo>
<ejemplo><a /><a /></ejemplo> <!-- ERROR: sólo admite <a /><b /> o <b /><a /> -->

Cardinalidad

La cardinalidad es el número de veces que puede aparecer un determinado contenido en un elemento. Se realiza mediante estos símbolos:

  • ? Contenido opcional, puede aparecer (una sola vez) o no aparecer
  • * Contenido opcional y repetible. Es decir puede no aparecer y puede incluso aparecer varias veces
  • + Contenido obligatorio y repetible. Tiene que aparecer e incluso puede aparecer varias veces

Ejemplos:

? (interrogante)

<!DOCTYPE ejemplo [
<!ELEMENT ejemplo (a, b?)>
<!ELEMENT a EMPTY>
<!ELEMENT b EMPTY>
]>
<ejemplo><a /></ejemplo>
<ejemplo><a /><b /></ejemplo>
<ejemplo><b /></ejemplo> <!-- ERROR: falta el elemento <a /> -->
<ejemplo><b /><b /></ejemplo> <!-- ERROR: el elemento <b /> aparece dos veces -->

* (asterísco):

<!DOCTYPE ejemplo [
<!ELEMENT ejemplo (a*, b)>
<!ELEMENT a EMPTY>
<!ELEMENT b EMPTY>
]>
<ejemplo><b /></ejemplo>
<ejemplo><a /><a /><b /></ejemplo>
<ejemplo><b /><a /></ejemplo> <!-- ERROR: el elemento <a /> aparece después de <b />-->

+ (suma):

<!DOCTYPE ejemplo [
<!ELEMENT ejemplo (a+, b)>
<!ELEMENT a EMPTY>
<!ELEMENT b EMPTY>
]>
<ejemplo><a /><b /></ejemplo>
<ejemplo><a /><a /><b /></ejemplo>
<ejemplo><b /></ejemplo> <!-- ERROR: falta el elmento <a /> -->

Según la instrucción siguiente

<!ELEMENT pelicula (titulo, direccion+, argumento?, actor*)>

el elemento película consta de un título, uno o más elementos de dirección, puede o no tener argumento, y de varios a ningún actor (además se tendría que respetar ese orden).

Otro ejemplo (polígono.dtd):

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT poligono ((coordX,coordY)+ | nombre)>
<!ELEMENT coordX (#PCDATA)>
<!ELEMENT coordY (#PCDATA)>
<!ELEMENT nombre (#PCDATA)>

Con esa DTD sería válido el documento:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poligono SYSTEM "polígono.dtd">
<poligono>
   <coordX>12</coordX>
   <coordY>13</coordY>
   <coordX>17</coordX>
   <coordY>23</coordY>
   <coordX>34</coordX>
   <coordY>56</coordY>
</poligono>

Pero también es válido:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poligono SYSTEM "polígono.dtd">
<poligono>
   <nombre>Triángulo</nombre>
</poligono>

Creado con eXeLearning (Ventana nueva)