Validación de documentos XML: dos mecanismos con objetivos similares pero capacidades muy distintas.
| 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 | Sí, permite definir tipos simples y complejos |
| Extensibilidad | Limitada | Sí, más extensible |
| Namespaces | No los soporta bien | Sí, 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 |
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)CDATA, PCDATA, EMPTY, ANY, ID, IDREF...?, *, +<!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
preciosea un número, ni quemonedatenga un valor concreto como "EUR" o "USD".
<!-- DTD interno -->
<?xml version="1.0"?>
<!DOCTYPE libro [<!ELEMENT libro (titulo)> ...]>
<!-- DTD externo -->
<!DOCTYPE libro SYSTEM "libro.dtd">
.xsdxs:string, xs:integer, xs:boolean, xs:date, xs:decimal...xmlns)minOccurs, maxOccurs, pattern, minLength, maxLength, enumeration, minInclusive, maxInclusive...<?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
preciosea decimal y quemonedasea "EUR" o "USD".
<?xml version="1.0"?>
<libro xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="libro.xsd">
...
</libro>
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
| 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 |
| 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 |
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.
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.
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.