Declaración
Para realizar una validación de un documento XML utilizando un XSD, debemos realizar dos pasos:
- Crear el XSD y definir la estructura a validar en él.
- Vincular el XSD creado en el documento XML para que se pueda utilizar para su validación.
Creación del XSD
La creación de un XSD también se conoce como la creación de un esquema. Los elementos XML que se utilizan para generar un esquema han de pertenecer al namespace XML Schema, el cual establece el prefijo xs:
para todos ellos.
Un fichero XSD base tiene la siguiente estructura:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- El resto de elementos -->
</xs:schema>
Tanto en el documento XML como en el documento XSD, opcionalmente, podemos incluir la declaración XML:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- El resto de elementos -->
</xs:schema>
En los ejemplos omitiremos la declaración XML por claridad, pero es recomendable incluirla.
El elemento schema
siempre será el elemento raíz y contiene declaraciones para todos los elementos y atributos que puedan aparecer en un documento XML que deseemos validar. Además, tendrá definido el atributo xmlns:xs
con la URL al namespace de XML Schema.
Algunos elementos hijos posibles son:
element
attribute
simpleType
complexType
group
attributeGroup
Cada uno de estos elementos de XML Schema tiene una función específica en la definición de los tipos de datos y las restricciones de un documento XML.
Vincular el XSD en el documento XML
Una vez creado el documento XSD, debemos indicar en el documento XML que queremos validarlo siguiente el XSD definido. Para ello, debemos añadir unos atributos en el elemento raíz del documento XML:
<raiz
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="esquema.xsd">
<!-- ... -->
</raiz>
Donde:
- El atributo
xmlns:xs
tiene siempre el valorhttp://www.w3.org/2001/XMLSchema-instance
. Es la definición de un namespace, el cual se utiliza para indicar que el documento está siendo validado contra un esquema XSD. El sufijoxs
puede ser otro diferente, pero tenemos que utilizar siempre el mismo. - El atributo
xs:noNamespaceSchemaLocation
referencia al fichero XSD donde se encuentra el esquema. En este caso, el archivo esesquema.xsd
, el cual se debe encontrar en el mismo directorio que el documento XML. Se está utilizando el prefijoxs:
, que forma parte del namespace definido en el atributo anterior. Es decir, se está definiendo un atributonoNamespaceSchemaLocation
que forma parte del espacio de nombresxs
.
Algunas aplicaciones no validan correctamente los documentos XML si indicamos las URLs en su versión HTTPS. Es decir, debemos evitar las siguientes URLs:
https://www.w3.org/2001/XMLSchema
https://www.w3.org/2001/XMLSchema-instance
En su lugar, utilizamos las siguientes:
http://www.w3.org/2001/XMLSchema
http://www.w3.org/2001/XMLSchema-instance
Los espacios de nombres se indican en el elemento raíz de un documento XML utilizando el prefijo xlmns:
(XML Namespace). A continuación del prefijo, se indica un nombre para el namespace. El valor del atributo es una URL que permite identificarlos de forma única.
Para utilizar el espacio de nombres, únicamente tenemos que añadir como prefijo el nombre elegido para el namespace a un elemento o atributo.
<cartas
xmlns:baraja="https://www.lmsgi.com/baraja"
xmlns:restaurante="https://www.lmsgi.com/restaurante">
<baraja:carta></baraja:carta>
<restaurante:carta></restaurante:carta>
</cartas>
Consideremos el siguiente documento XML:
<alumna
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="alumna.xsd">
Olga Velarde Cobo
</alumna>
Un XML Schema que valida el documento anterior sería:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="alumna" type="xs:string"/>
</xs:schema>
El XSD anterior contiene un elemento <xs:element>
. Este elemento indica que el documento XML debe tener un elemento con nombre alumna
y que su contenido es una cadena de caracteres.