Un XML Schema, también conocido como XSD (XML Schema Definition), es un lenguaje basado en XML que define las reglas de validación de un documento XML.
Es similar a un DTD, pero mucho más avanzado, porque:
Por eso, hoy en día XSD ha reemplazado al DTD en la mayoría de sistemas.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Definiciones aquí -->
</xs:schema>
xs:
es el prefijo estándar para los elementos del esquema.http://www.w3.org/2001/XMLSchema
es el namespace oficial de XML Schema.Archivo persona.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Definición del elemento raíz -->
<xs:element name="persona">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="apellido" type="xs:string"/>
<xs:element name="edad" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Reglas definidas en este XSD:
<persona>
.<nombre>
, <apellido>
, <edad>
.nombre
y apellido
: texto (xs:string
).edad
: número entero (xs:integer
).Archivo persona.xml válido
<?xml version="1.0" encoding="UTF-8"?>
<persona xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="persona.xsd">
<nombre>Ana</nombre>
<apellido>Pérez</apellido>
<edad>30</edad>
</persona>
Archivo persona.xml inválido
<persona>
<nombre>Ana</nombre>
<apellido>Pérez</apellido>
<edad>treinta</edad>
</persona>
Inválido porque edad
debe ser un número entero (xs:integer
), no texto.
XSD soporta muchos tipos de datos predefinidos:
xs:string
: texto.xs:integer
: enteros.xs:decimal
: números con decimales.xs:boolean
: true
o false
.xs:date
: fecha (YYYY-MM-DD).xs:time
: hora (HH:MM:SS).Ejemplo:
<xs:element name="activo" type="xs:boolean"/>
<xs:element name="salario" type="xs:decimal"/>
<xs:element name="fechaNacimiento" type="xs:date"/>
Además de definir tipos de datos, se pueden establecer restricciones.
Edad entre 0 y 120:
<xs:element name="edad">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Nombre con mínimo 3 y máximo 50 caracteres:
<xs:element name="nombre">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="3"/>
<xs:maxLength value="50"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<persona xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="persona.xsd">
<nombre>Laura</nombre>
<apellido>Gómez</apellido>
<edad>28</edad>
</persona>
xmlns:xsi
habilita el uso de atributos de esquema.xsi:noNamespaceSchemaLocation="persona.xsd"
indica dónde está el archivo XSD.xmllint --noout --schema persona.xsd persona.xml
Si es válido, no muestra nada. Si hay errores, indica línea y motivo.
Archivo biblioteca.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="biblioteca">
<xs:complexType>
<xs:sequence>
<xs:element name="libro" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="titulo" type="xs:string"/>
<xs:element name="autor" type="xs:string"/>
<xs:element name="año" type="xs:integer"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Archivo biblioteca.xml válido
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="biblioteca.xsd">
<libro id="L1">
<titulo>1984</titulo>
<autor>George Orwell</autor>
<año>1949</año>
</libro>
<libro id="L2">
<titulo>Don Quijote</titulo>
<autor>Miguel de Cervantes</autor>
<año>1605</año>
</libro>
</biblioteca>