La validación es el proceso de comprobar que un documento XML:
La gran diferencia con DTD es que XSD permite definir tipos de datos, restricciones y estructuras más complejas.
xsi:noNamespaceSchemaLocation
).Archivo persona.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<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>
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>Laura</nombre>
<apellido>Pérez</apellido>
<edad>30</edad>
</persona>
Aquí:
xmlns:xsi
habilita el uso de atributos de esquema.xsi:noNamespaceSchemaLocation="persona.xsd"
indica qué archivo XSD usar.Archivo persona.xml inválido
<?xml version="1.0" encoding="UTF-8"?>
<persona xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="persona.xsd">
<nombre>Laura</nombre>
<apellido>Pérez</apellido>
<edad>treinta</edad>
</persona>
Este XML es bien formado pero no válido, porque el XSD exige que <edad>
sea un número entero (xs:integer
).
Permiten cargar el XML y el XSD para comprobar si es válido.
Si tenés instalado xmllint (Linux, Mac o Windows con Cygwin), podés validar así:
xmllint --noout --schema persona.xsd persona.xml
--schema
: indica el archivo XSD.--noout
: evita que imprima el XML completo.Si es válido, no muestra nada. Si es inválido, muestra los errores.
Ejemplo de error detectado:
persona.xml:7: element edad: Schemas validity error : Element 'edad': 'treinta' is not a valid value of the atomic type 'xs:integer'.
Archivo empleado.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="empleado">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="edad">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="18"/>
<xs:maxInclusive value="65"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="estadoCivil">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="soltero"/>
<xs:enumeration value="casado"/>
<xs:enumeration value="divorciado"/>
<xs:enumeration value="viudo"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Archivo empleado.xml válido
<empleado xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="empleado.xsd">
<nombre>Ana</nombre>
<edad>35</edad>
<estadoCivil>casado</estadoCivil>
</empleado>
Archivo empleado.xml inválido
<empleado>
<nombre>Ana</nombre>
<edad>70</edad> <!-- Error: fuera de rango 18-65 -->
<estadoCivil>union libre</estadoCivil> <!-- Error: no permitido -->
</empleado>
xsi:noNamespaceSchemaLocation
)..xsd
.xmllint
).