📝 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

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.