Saltar al contenido principal

Resumen XSD

XSD (XML Schema Definition) define la estructura y los elementos y atributos que puede llevar un documento XML.

Se utiliza para validar documentos XML.

Características

  • Se utiliza notación XML.
  • Permite definir nombre y orden de los elementos de un elemento.
  • Permite definir tipos de datos.
  • Permite indicar valores por defecto y valores fijos.
  • Permite establecer restricciones muy precisas.

Declaración

XML
<?xml version="1.0" encoding="UTF-8"?>
<root
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file.xsd">
<!-- ... -->
</root>
file.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- ... -->
</xs:schema>

Elementos XSD básicos

Elementos de XML Schema básicos:

  • Elementos: element
  • Atributos: attribute

Elementos

<xs:element name="modelo" type="xs:string"  />
<xs:element name="ruedas" type="xs:integer" default="4" />
<xs:element name="color" type="xs:string" fixed="rojo" />

Atributos

<xs:attribute name="idioma" type="xs:string" />                   <!-- atributo opcional -->
<xs:attribute name="idioma" type="xs:string" fixed="EN" /> <!-- valor fijo -->
<xs:attribute name="idioma" type="xs:string" default="EN" /> <!-- valor por defecto -->
<xs:attribute name="idioma" type="xs:string" use="required" /> <!-- obligatorio -->

Tipos de datos

Los tipos de datos predefinidos se clasifican en:

Los valores de los tipos de datos se definen en un atributo type.

TipoVálidoNo válido
stringcadena de texto,PB&amp;JAT&T, 3 > 4
decimal23.4,-3.0,.3,3.23,4
integer57,0,-3, +33.,5.6
positiveInteger57,1,+3-3,0,-5.6
negativeInteger-3,-5.657,0,+3
booleantrue,false,1,0TRUE, T
date1970-03-2727/03/1970,2004-4-2,04-12-2004
time13:20:00,13:20:00Z5:20:00, 13:20.5:00
IDa105
IDREFa105
IDREFSa10 a115,6

Restricciones

Las restricciones se aplican sobre los valores de atributos o elementos.

<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<!-- ... -->
</xs:restriction>
</xs:simpleType>
</xs:element>

Se debe definir un tipo base para la restricción en el atributo base de restriction.

RestricciónDescripción
enumerationLista de valores aceptados.
patternPatrón de caracteres admitidos.
whiteSpaceCómo se gestionan los espacios en blanco (líneas, tabuladores, espacios y saltos de línea).
Opciones: preserve, replace, collapse.
lengthNúmero de caracteres.
maxLenghtNúmero máximo de caracteres.
minLenghtNúmero mínimo de caracteres.
totalDigitsNúmero máximo de dígitos admitidos en números decimales y tipos de datos derivados (dígitos antes y después del punto decimal, sin contar el punto separador).
fractionDigitsNúmero máximo de decimales.
maxExclusiveNúmero máximo que puede alcanzar un valor (excluído).
minExclusiveNúmero mínimo que puede alcanzar un valor (excluído).
maxInclusiveNúmero máximo que puede alcanzar un valor (incluído).
minInclusiveNúmero mínimo que puede alcanzar un valor (incluído).

Los valores de las restricciones se definen en un atributo value.

<xs:element name="codigo">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{2}[0-9]{4}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="color">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="verde"/>
<xs:enumeration value="amarillo"/>
<xs:enumeration value="rojo"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

Definición de tipos de datos

Los tipos de elementos se clasifican en dos grupos:

TipoElementoDescripción
SimplesimpleTypeNo contiene otros elementos.
No contiene atributos.
ComplejocomplexTypeContiene 1 o más elementos y/o atributos.

Simples

<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>

Complejos

<xs:element name="persona">
<xs:complexType mixed="true"> <!-- contenido mixto -->
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="ciudad" type="xs:string"/>
<xs:element name="edad" type="xs:positiveInteger"/>
</xs:sequence>
<xs:attribute name="dni" type="xs:string"/> <!-- atributo -->
</xs:complexType>
</xs:element>

El elemento complexType acepta un atributo mixed para indicar que el contenido puede ser mixto.

Contenido

El contenido de un elemento se refiere a la información albergada entre la etiqueta de apertura y cierre de un elemento.

<etiqueta>CONTENIDO</etiqueta>

El tipo de contenido se aplica únicamente a complexType y se clasifica en dos grupos:

TipoElementoDescripción
SimplesimpleContentElementos que no contienen otros elementos.
ComplejocomplexContentElementos que contienen otros elementos.

En ambos tipos, los tipos de contenidos habitualmente van ligados a las extensiones o restricciones.

extension

Una extensión sirve para extender un elemento simpleType o complexType:

  • Se define con el elemento extension,
  • El elemento extension es un elemento hijo de simpleContent o complexContent.
  • Debe contener un atributo base que indica el tipo de dato base. Es idéntico a lo que ocurre en restriction.
<xs:simpleContent>
<xs:extension base="xs:string">
<!-- ... -->
</xs:extension>
</xs:simpleContent>
<xs:complexContent>
<xs:extension base="otroTipo">
<!-- ... -->
</xs:extension>
</xs:complexContent>

simpleContent

<precio divisa="EUR">6.2</precio>
<xs:element name="precio">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="divisa" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>

complexContent

<ficha numero="1">
<nombre>Eva</nombre>
<edad>25</edad>
<ciudad>París</ciudad>
<pais>Francia</pais>
</ficha>
<xs:complexType name="infoPersonaAmpliada">
<xs:complexContent>
<xs:extension base="infoPersona">
<xs:sequence>
<xs:element name="ciudad" type="xs:string"/>
<xs:element name="pais" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="infoPersona">
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="edad" type="xs:integer"/>
</xs:sequence>
<xs:attribute name="numero" type="xs:integer"/>
</xs:complexType>

<xs:element name="ficha" type="infoPersonaAmpliada" />

Indicadores

Los indicadores permiten establecer cómo se van a escribir (o utilizar) los elementos en un XML.

TipoElementoDescripción
De ordensequenceEspecifica el orden en el que obligatoriamente deben aparecer los elementos hijo de un elemento.
De ordenallTodos los elementos hijo deben aparecer una única vez y pueden aparecer en cualquier orden.
De ordenchoiceSolamente se permite escribir uno de los elementos hijo.
De ocurrenciaminOccursNúmero mínimo de veces que se debe utilizar un elemento
De ocurrenciamaxOccursNúmero máximo de veces que se puede utilizar un elemento. El valor unbounded se utiliza para indicar un uso ilimitado del elemento.

sequence

<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

all

<xs:element name="person">
<xs:complexType>
<xs:all>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>

choice

<xs:element name="person">
<xs:complexType>
<xs:choice>
<xs:element name="employee" type="employee"/>
<xs:element name="member" type="member"/>
</xs:choice>
</xs:complexType>
</xs:element>

maxOccurrs

<xs:element name="pelicula">
<xs:complexType>
<xs:sequence>
<xs:element name="titulo" type="xs:string"/>
<xs:element name="genero" type="xs:string" maxOccurs="10"/>
</xs:sequence>
</xs:complexType>
</xs:element>

minOccurs

<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string" maxOccurs="10" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>

Grupos

Los grupos son una forma de agrupar varios elementos y/o atributos y asignarles un nombre común. Esto permite reutilizar código.

ElementoDescripción
groupGrupos de elementos.
attributeGroupGrupos de atributos.

group

<persona>
<nombre>Eva</nombre>
<apellidos>Martínez López</apellidos>
<aniversario>--02-24</aniversario>
<pais>España</pais>
</persona>
<!-- definición del grupo -->
<xs:group name="grupoPersona">
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="apellidos" type="xs:string"/>
<xs:element name="aniversario" type="xs:gMonthDay"/>
</xs:sequence>
</xs:group>

<xs:complexType name="infoPersona">
<xs:sequence>
<xs:group ref="grupoPersona"/> <!-- referencia al grupo (uso del grupo) -->
<xs:element name="pais" type="xs:string"/>
</xs:sequence>
</xs:complexType>

<xs:element name="persona" type="infoPersona"/>

attributeGroup

<persona nombre="Eva" apellidos="Martínez López" aniversario="--02-24" pais="España" />
<!-- definición del grupo -->
<xs:attributeGroup name="infoPersonaAtributos">
<xs:attribute name="nombre" type="xs:string"/>
<xs:attribute name="apellidos" type="xs:string"/>
<xs:attribute name="aniversario" type="xs:gMonthDay"/>
</xs:attributeGroup>

<xs:complexType name="infoPersona">
<xs:attributeGroup ref="infoPersonaAtributos"/> <!-- referencia al grupo -->
<xs:attribute name="pais" type="xs:string"/>
</xs:complexType>

<xs:element name="persona" type="infoPersona" />