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...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.
<?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.