📝 DTD_XML
← Volver

DTD vs XML Schema (XSD)

Validación de documentos XML: dos mecanismos con objetivos similares pero capacidades muy distintas.


Tabla Comparativa Rápida

Aspecto DTD XML Schema (XSD)
Sintaxis No usa sintaxis XML propia de XML; tiene una sintaxis específica distinta Sí usa sintaxis XML
Tipado Muy limitado Fuertemente tipado
Tipos de datos Básicos y escasos Permite muchos tipos de datos: string, integer, boolean, date, etc.
Definición de tipos nuevos No de forma rica y flexible , permite definir tipos simples y complejos
Extensibilidad Limitada Sí, más extensible
Namespaces No los soporta bien , soporta namespaces
Restricciones Menos potente Más potente: cardinalidad, patrones, rangos, longitudes…
Legibilidad Más simple y corto Más verboso, pero más preciso
Uso actual Más antiguo, legado Más moderno y potente

Contexto: ¿Para qué sirven?

Ambos mecanismos definen la estructura válida de un documento XML: qué elementos pueden aparecer, en qué orden, cuántas veces y con qué contenido. Son los "contratos" que debe cumplir un XML para considerarse válido (no solo bien formado).

Documento XML  →  Validador  →  ¿Válido?
                     ↑
               DTD  o  XSD

DTD (Document Type Definition)

Características principales

Ejemplo DTD

<!DOCTYPE libro [
  <!ELEMENT libro (titulo, autor, precio)>
  <!ELEMENT titulo (#PCDATA)>
  <!ELEMENT autor  (#PCDATA)>
  <!ELEMENT precio (#PCDATA)>
  <!ATTLIST precio moneda CDATA #REQUIRED>
]>

⚠️ El DTD no puede validar que precio sea un número, ni que moneda tenga un valor concreto como "EUR" o "USD".

Referencia en el XML

<!-- DTD interno -->
<?xml version="1.0"?>
<!DOCTYPE libro [<!ELEMENT libro (titulo)> ...]>

<!-- DTD externo -->
<!DOCTYPE libro SYSTEM "libro.dtd">

XML Schema (XSD)

Características principales

Namespace

Un namespace XML es un identificador (normalmente una URI/URL) que se asocia a las etiquetas de un documento para distinguir elementos con el mismo nombre pero de vocabularios distintos.
Sirve para evitar colisiones de nombres cuando mezclas vocabularios XML en un mismo documento.
La URL: solo tiene que ser una cadena única con forma de URI. No hace falta que exista ni que apunte a nada (aunque por convención muchas veces se pone una URL del proyecto/empresa). Es solo un identificador, no se descarga nada.

Ejemplo XSD equivalente al DTD anterior

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="libro">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="titulo"  type="xs:string"/>
        <xs:element name="autor"   type="xs:string"/>
        <xs:element name="precio">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:decimal">
                <xs:attribute name="moneda">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <xs:enumeration value="EUR"/>
                      <xs:enumeration value="USD"/>
                    </xs:restriction>
                  </xs:simpleType>
                </xs:attribute>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

✅ XSD sí puede validar que precio sea decimal y que moneda sea "EUR" o "USD".

Referencia en el XML

<?xml version="1.0"?>
<libro xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="libro.xsd">
  ...
</libro>

Diagrama: Capacidad de restricción

RESTRICCIONES POSIBLES

                DTD          XSD
               ──────       ──────
Elemento        ✅           ✅
Atributo        ✅           ✅
Tipo dato       ❌  básico   ✅  completo
Cardinalidad    ❌  ?,*,+    ✅  min/maxOccurs
Patrón regex    ❌           ✅  <xs:pattern>
Rango numérico  ❌           ✅  min/maxInclusive
Longitud        ❌           ✅  min/maxLength
Enumeración     ❌  parcial  ✅  <xs:enumeration>
Namespace       ❌           ✅
Tipos propios   ❌           ✅  simpleType/complexType

Tipos de datos en XSD

Categoría Tipos disponibles
Texto xs:string, xs:normalizedString, xs:token
Numéricos xs:integer, xs:decimal, xs:float, xs:double
Fecha/Hora xs:date, xs:time, xs:dateTime, xs:duration
Lógicos xs:boolean
Binarios xs:base64Binary, xs:hexBinary
URI xs:anyURI
ID/Refs xs:ID, xs:IDREF, xs:IDREFS

Cuándo usar cada uno

Situación Recomendación
Documento XML simple, legado DTD
Validación de tipos de datos estricta XSD
Uso de namespaces XSD
Interoperabilidad con sistemas modernos XSD
Rapidez y simplicidad en estructura básica DTD
Definir reglas de negocio complejas XSD

Resumen en 3 puntos

  1. DTD es la forma clásica de validar XML, con sintaxis propia no-XML, tipado muy limitado y sin soporte de namespaces; útil para estructuras simples o sistemas legados.

  2. XML Schema (XSD) es la evolución moderna: usa sintaxis XML, ofrece tipado fuerte con decenas de tipos de datos, permite definir tipos personalizados y soporta namespaces, siendo mucho más potente y expresivo.

  3. La diferencia clave en oposiciones: DTD no puede validar el tipo de dato del contenido de un elemento (no sabe si es un número o una fecha), mientras que XSD sí, permitiendo restricciones de patrón, rango, longitud y enumeración.