Saltar al contenido principal

Resumen DTD

Un DTD (Document Type Definition) es un conjunto de reglas y especificaciones que define la estructura y el contenido de un documento XML.

Se utiliza para validar documentos XML.

Declaración

DTD interno

El DTD está incluido en el documento XML.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE email[
<!ELEMENT email (date, to, from)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
]>
<email>
<date>2008-01-10</date>
<to>Tove</to>
<from>Jani</from>
</email>

DTD externo

El DTD es un fichero externo. Se debe indicar el atributo standalone en la declaración XML.

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE email SYSTEM "email.dtd">
<email>
<date>2008-01-10</date>
<to>Tove</to>
<from>Jani</from>
</email>
email.dtd
<?xml version="1.0"?>
<!ELEMENT email(date, to, from)>
<!ELEMENT to(#PCDATA)>
<!ELEMENT from(#PCDATA)>
<!ELEMENT date(#PCDATA)>

Elementos

Contenido

ContenidoEjemploDescripción
PCDATA<!ELEMENT date (#PCDATA)>PCDATA (Parsed Character Data).
NO puede contener caracteres como <, >, &...
EMPTY<!ELEMENT date EMPTY>Elementos vacíos: <date />
ANY<!ELEMENT date ANY>Pueden contener cualquier cosa.
Elemento<!ELEMENT date (a, b)>Puede contener un elemento <a> y un elemnto <b>.
<!ELEMENT articulo (#PCDATA)>           <!-- OK -->
<!ELEMENT articulo #PCDATA> <!-- ERROR -->
<!ELEMENT articulo EMPTY> <!-- OK -->
<!ELEMENT articulo ANY> <!-- OK -->
<!ELEMENT articulo (nombre, precio)> <!-- OK -->
<!ELEMENT articulo nombre, precio> <!-- ERROR -->

Cardinalidad

ModificadorCardinalidadDescripción
?0-1El elemento es opcional, pudiendo aparecer una sola vez o ninguna.
+1-nEl elemento tiene que aparecer, obligatoriamente, una o más veces.
*0-nEl elemento puede aparecer cero, una o más veces.
<!ELEMENT texto (#PCDATA)>                              <!-- una vez -->
<!ELEMENT articulo (codigo | id)> <!-- "codigo" o "id" -->
<!ELEMENT articulos (codigo | id)*> <!-- puede contener varios "codigo" y/o "id" -->
<!ELEMENT articulo ((codigo | id), nombre)> <!-- codigo o id, y nombre -->
<!ELEMENT localidad ((pais, ciudad) | codigo_postal)> <!-- pais y ciudad, o código postal -->
<!ELEMENT articulos (#PCDATA | codigo | id)> <!-- contenido mixto -->
<!ELEMENT articulos (codigo | #PCDATA | id*> <!-- INCORRECTO: #PCDATA debe ir primero -->

Atributos

Contenido

TipoDescripción
EnumeraciónEnumeración. Permite definir una lista de valores permitidos.
CDATACadena de texto.
NMTOKENName Token.
NMTOKENSLista de NMTOKEN.
IDIdentificador único del elemento.
IDREFReferencia a un ID de otro elemento. Establece conexiones entre elementos.
IDREFSLista de IDREF. Permite referenciar a múltiples IDs.
ENTITYRepresenta una entidad general no interpetada (unparsed general entity).
ENTITIESLista de ENTITY.
NOTATIONNombre de una notación.
<!ATTLIST email data (jan|feb|mar)>             <!-- ERROR -->
<!ATTLIST email data (jan|feb|mar) "jan"> <!-- OK -->
<!ATTLIST email data (jan|feb|mar) #IMPLIED> <!-- OK -->
<!ATTLIST email data CDATA #IMPLIED>
<!ATTLIST email data NMTOKEN #IMPLIED>
<!ATTLIST email data NMTOKENS #IMPLIED>
<!ATTLIST email data ID #IMPLIED>
<!ATTLIST email data IDREF> <!-- ERROR -->
<!ATTLIST email data IDREF #IMPLIED> <!-- OK -->
<!ATTLIST email data IDREFS #IMPLIED>

Modificadores

ModificadorDescripción
#REQUIREDAtributo obligatorio.
#IMPLIEDAtributo sin valor fijo, sin valor por defecto y no requerido. El atributo es opcional.
#FIXEDAtributo con valor fijo.
<!ATTLIST email uid CDATA #REQUIRED>
<!ATTLIST email uid CDATA #IMPLIED>
<!ATTLIST email uid CDATA #FIXED "eml">

Entidades

Entidades de XML

&amp;    <!-- Muestra & -->
&quot; <!-- Muestra " -->
&apos; <!-- Muestra ' -->
&lt; <!-- Muestra < -->
&gt; <!-- Muestra > -->

Entidades propias

<!ENTITY escritor "Miguel de Cervantes">   <!--General interna -->
<!ENTITY lenguaje SYSTEM "lang.txt"> <!--General externa (privada) -->
<!ENTITY % texto "(#PCDATA)"> <!-- Paramétrica interna -->
<!ENTITY % idioma SYSTEM "idioma.dtd"> <!-- Paramétrica externa (privada) -->
&escritor;   <!-- Entidad general -->
%texto; <!-- Entidad paramétrica -->

Secciones condicionales

El uso de las secciones condicionales suele estar ligado a entidades paramétricas.

<![ INCLUDE [ declaraciones ]]>  <!-- Incluir -->
<![ IGNORE [ declaraciones ]]> <!-- Ignorar -->