Generador XSD
Generar esquema XML a partir de ejemplos
Documento XML (Entrada)
Esquema XSD (Salida)
XSD describe formalmente la estructura, el contenido y las restricciones de un documento XML. Es el plano que define qué elementos, atributos y tipos de datos están permitidos.
¿Qué es XSD?
XSD (XML Schema Definition) es un estándar del W3C para describir la estructura y las restricciones de documentos XML. Piense en él como un contrato: el XSD define qué elementos, atributos y tipos de datos están permitidos, y un validador XML verifica si un documento dado cumple con el contrato.
Antes de XSD, los desarrolladores usaban DTDs (Document Type Definitions) para describir la estructura XML. Los DTDs eran simples pero limitados: no podían expresar tipos de datos (el contenido de un elemento era simplemente “texto”), no podían definir restricciones complejas y usaban una sintaxis no-XML. XSD fue creado para abordar todas estas limitaciones mientras se expresaba en XML mismo.
XSD es fundamental para la integración empresarial. Impulsa los servicios web SOAP (los archivos WSDL hacen referencia a esquemas XSD), los estándares de mensajería financiera como ISO 20022 y SWIFT MX, los estándares de salud como HL7 CDA y los formatos de intercambio de datos gubernamentales en todo el mundo.
Elementos y tipos complejos
Los esquemas XSD se construyen a partir de dos conceptos fundamentales: elementos y tipos.
Una declaración de elemento define un dato con nombre que puede aparecer en un documento XML:
<xs:element name="email" type="xs:string"/>
Un tipo complejo define un elemento que contiene elementos hijos o atributos:
<xs:complexType name="PersonType">
<xs:sequence>
<xs:element name="firstName" type="xs:string"/>
<xs:element name="lastName" type="xs:string"/>
<xs:element name="email" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
Los compositores (xs:sequence, xs:choice, xs:all) controlan cómo aparecen los elementos hijos:
xs:sequence— Los hijos deben aparecer en el orden especificadoxs:choice— Exactamente uno de los hijos debe aparecerxs:all— Todos los hijos deben aparecer, pero en cualquier orden
Tipos de datos incorporados
XSD proporciona un rico conjunto de tipos de datos incorporados que van mucho más allá del enfoque de DTD de “todo es texto”:
| Tipo | Descripción | Valores de ejemplo |
|---|---|---|
xs:string | Texto Unicode | "Hello", "Cafe\u0301" |
xs:integer | Número entero (sin límite) | 42, -7, 0 |
xs:decimal | Número decimal exacto | 3.14, -0.001 |
xs:boolean | Verdadero o falso | true, false, 1, 0 |
xs:date | Fecha de calendario (ISO 8601) | 2024-03-15 |
xs:dateTime | Fecha y hora con zona horaria | 2024-03-15T14:30:00Z |
xs:anyURI | Referencia URI | https://example.com |
Puede restringir aún más estos tipos usando facetas — restricciones como minInclusive, maxInclusive, pattern, enumeration, minLength y maxLength. Por ejemplo, para definir una edad entre 0 y 150:
<xs:simpleType name="AgeType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="150"/>
</xs:restriction>
</xs:simpleType>
XSD vs DTD vs RELAX NG
| Característica | DTD | XSD | RELAX NG |
|---|---|---|---|
| Sintaxis | No-XML | XML | XML o compacta |
| Tipos de datos | Ninguno | 44+ incorporados | Extensible |
| Espacios de nombres | Limitado | Soporte completo | Soporte completo |
| Restricciones | Básicas | Ricas (facetas, claves, identidad) | Moderadas |
| Adopción industrial | Legacy | Dominante (SOAP, ISO 20022) | Nicho (DocBook, TEI) |
| Complejidad | Baja | Alta | Media |
| Estándar W3C | Sí (XML 1.0) | Sí | OASIS (ISO/IEC 19757-2) |
DTD es el lenguaje de esquema XML original, definido como parte de la propia especificación XML 1.0. Usa una sintaxis no-XML y no tiene concepto de tipos de datos: todo el contenido de los elementos es simplemente texto. Los DTDs aún se usan en sistemas legacy y para declarar entidades, pero son inadecuados para las necesidades de validación modernas.
XSD es la respuesta del W3C a las limitaciones de DTD. Ofrece un sistema de tipos completo, soporte de espacios de nombres y mecanismos de restricción potentes. Sin embargo, su verbosidad y complejidad son críticas frecuentes: incluso esquemas simples pueden ser verbosos.
RELAX NG es una tercera opción que busca un punto intermedio: más potente que DTD, más simple que XSD. Ofrece tanto una sintaxis XML como una sintaxis compacta más legible. Aunque técnicamente superior en muchos aspectos, no ha alcanzado la dominancia de mercado de XSD y se usa principalmente en publicación (DocBook) y humanidades digitales (TEI).
Casos de uso comunes
- Servicios web SOAP: Los archivos WSDL usan XSD para definir la estructura de los mensajes de solicitud y respuesta intercambiados entre servicios
- Mensajería financiera (ISO 20022): El estándar global de mensajería financiera usa XSD para definir cada tipo de mensaje, desde la iniciación de pagos (pain.001) hasta los extractos de cuenta (camt.053)
- Validación de configuración: Los archivos de configuración de aplicaciones en XML pueden validarse contra XSD para detectar errores antes del despliegue
- Intercambio de datos: Las integraciones B2B usan XSD para formalizar el contrato entre socios comerciales, asegurando que ambas partes produzcan y consuman documentos conformes
- Generación de código: Herramientas como JAXB (Java), xsd.exe (.NET) y xmlschema (Python) generan clases a partir de XSD, permitiendo el procesamiento XML con seguridad de tipos sin análisis manual
Prueba estos ejemplos
Un esquema XSD mínimo que define un elemento 'person' con elementos hijos requeridos 'name' (string) y 'age' (integer) en secuencia. Cualquier documento XML con una raíz <person> que contenga estos dos elementos en orden será válido.
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'><xs:element name='person'><xs:complexType><xs:sequence><xs:element name='name' type='xs:string'/><xs:element name='age' type='xs:integer'/></xs:sequence></xs:complexType></xs:element></xs:schema> Este XML tiene la estructura correcta pero 'not-a-number' no es un xs:integer válido. El validador XSD rechazará este documento con una violación de restricción de tipo en el elemento 'age'.
<person><name>Alice</name><age>not-a-number</age></person>