Validación XML – Uso de Schema

A la hora de validar un documento XML tenemos varias opciones, entre ellas destacan los DTD y los schema, ¿Qué hace que nos decantemos por uno u otro? en este caso nos centraremos en las ventajas que shcema ofrece sobre DTD:

  • La sintaxis de los archivos DTD es muy similar a la de XML sin embargo no está estructurado bajo las normas de XML.
  • En cuanto a los datos, DTD permite definir contenidos, pero no tratar datos ni por extensión, su tipado, este es uno de los pilares de schema.
  • DTD no permite la no ordenación de secuencias, en este aspecto sigue un modelo en cascada totalmente rígido.
  • Schema permite hacer declaraciones sensibles al contexto, esto es, contenido con el mismo nombre pero con diferente aplicación según donde se localice.
  • Schema permite las referencias cruzadas, lo que hace posible formar claves a partir de varios atributos o nombres.

Ejemplo de la sintaxis de Schema:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="guarderia">
 <xs:complexType>
 <xs:sequence>
 <xs:element name="niño" minOccurs="1" maxOccurs="50"
type="tipoNiño"/>
 </xs:sequence>
 </xs:complexType>
 </xs:element>
 <xs:complexType name="tipoNiño">
 <xs:sequence>
 <xs:element name="nombre" type="xs:string"/>
 <xs:element name="fechaNacemento" type="xs:date"/>
 <xs:element name="peso" type="xs:decimal"/>
 <xs:element name="altura" type="xs:unsignedByte"/>
 <xs:element name="vacunas" type="xs:boolean"/>
 </xs:sequence>
 <xs:attribute name="numeroExpediente" type="xs:unsignedShort"/>
 </xs:complexType>
</xs:schema>

Dentro de esa sintaxis, muy reconocible para quienes conocen XML, encontramos varios elementos que debemos definir para facilitar su comprensión:

  • <xs:schema xmlns:xs=»URL»> -> Es el elemento raíz del schema y definición del espacio de nombres del esquema XML.
  • <xs:element name=»guarderia»> -> Define un elemento del XML
  • <xs:complexType>-> Define un tipo complejo de datos, normalmente compuesto por más de un dato o por uno con estructura compleja, en el ejemplo: <xs:element name=»niño» minOccurs=»1″ maxOccurs=»50″ type=»tipoNiño»> -> lo que hace esta sentencia es definir un elemento niño dentro de una secuencia que se repetirá de una a 50 veces, posteriormente define un tipo propio de datos «tipoNiño» que será especificado, como dato complejo que es, más adelante:
 <xs:complexType name="tipoNiño">
 <xs:sequence>
 <xs:element name="nombre" type="xs:string"/>
 <xs:element name="fechaNacemento" type="xs:date"/>
 <xs:element name="peso" type="xs:decimal"/>
 <xs:element name="altura" type="xs:unsignedByte"/>
 <xs:element name="vacunas" type="xs:boolean"/>
 </xs:sequence>
 <xs:attribute name="numeroExpediente" type="xs:unsignedShort"/>
 </xs:complexType>

Aquí podemos que el tipo complejo «tipoNiño» está compuesto por una secuencia de elementos, y que como se mencionaba arriba, schema nos permite definir el tipo de dato que acepta cada elemento.

El prefijo «xs» en cada elemento se utiliza por convención para referir al espacio de nombres del esquema XML.

¿Cómo vincular un XML a un esquema XML?

Para poder validar un XML a través de un schema, necesitamos vincularlos, para ellos existen dos posibles casos:

  • El documento XML no tiene su propio espacio de nombres: En este caso indicamos solamente el esquema de sus propios elementos , lo que necesitamos está definido en el espacio de nombres https://www.w3.org/2001/XMLSchema (al que nos referimos con el prefijo xs:).
<?xml version="1.0" ... ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <- Esquema XSD
... definición del Schema...
</xs:schema>

Y como el documento no tiene su propio espacio de nombres, se enlaza a su esquema a través de del atributo xsi:noNamespaceSchemaLocation=»SchemaNombre.xsd»

  • El documento tiene su propio espacio de nombres: En este caso debemos usar el targetNamespace en el elemento raíz para apuntar a la URI del espacio de nombres.
<?xml version="1.0" ... ?>
<pref:elementoRaíz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:pref="URIdelEspacioDeNombres"
 xsi:schemaLocation="URIdelEspacioDeNombres esquema.xsd">
 ...
</pref:elementoRaíz>

Si añadimos el atributo elementFormDefault=»qualified», todos los elementos y atributos declarados en el esquema deberán aparecer cualificados con un espacio de nombres que usemos en el esquema.

¿Te ha resultado útil?

Promedio de puntuación 0 / 5. Recuento de votos: 0

Deja una respuesta