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 version="1.0" encoding="UTF-8"?>
<root
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file.xsd">
<!-- ... -->
</root>
<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:
- Primitivos:
string
,boolean
,decimal
, etc. - Derivados:
integer
,ID
,IDREF
,NMTOKEN
, etc.
Los valores de los tipos de datos se definen en un atributo type
.
Tipo | Válido | No válido |
---|---|---|
string | cadena de texto ,PB&J | AT&T , 3 > 4 |
decimal | 23.4 ,-3.0 ,.3 ,3. | 23,4 |
integer | 57 ,0 ,-3 , +3 | 3. ,5.6 |
positiveInteger | 57 ,1 ,+3 | -3 ,0 ,-5.6 |
negativeInteger | -3 ,-5.6 | 57 ,0 ,+3 |
boolean | true ,false ,1 ,0 | TRUE , T |
date | 1970-03-27 | 27/03/1970 ,2004-4-2 ,04-12-2004 |
time | 13:20:00 ,13:20:00Z | 5:20:00 , 13:20.5:00 |
ID | a10 | 5 |
IDREF | a10 | 5 |
IDREFS | a10 a11 | 5,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ón | Descripción |
---|---|
enumeration | Lista de valores aceptados. |
pattern | Patrón de caracteres admitidos. |
whiteSpace | Cómo se gestionan los espacios en blanco (líneas, tabuladores, espacios y saltos de línea). Opciones: preserve , replace , collapse . |
length | Número de caracteres. |
maxLenght | Número máximo de caracteres. |
minLenght | Número mínimo de caracteres. |
totalDigits | Nú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). |
fractionDigits | Número máximo de decimales. |
maxExclusive | Número máximo que puede alcanzar un valor (excluído). |
minExclusive | Número mínimo que puede alcanzar un valor (excluído). |
maxInclusive | Número máximo que puede alcanzar un valor (incluído). |
minInclusive | Nú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:
Tipo | Elemento | Descripción |
---|---|---|
Simple | simpleType | No contiene otros elementos. No contiene atributos. |
Complejo | complexType | Contiene 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:
Tipo | Elemento | Descripción |
---|---|---|
Simple | simpleContent | Elementos que no contienen otros elementos. |
Complejo | complexContent | Elementos 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 desimpleContent
ocomplexContent
. - Debe contener un atributo
base
que indica el tipo de dato base. Es idéntico a lo que ocurre enrestriction
.
<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.
Tipo | Elemento | Descripción |
---|---|---|
sequence | Especifica el orden en el que obligatoriamente deben aparecer los elementos hijo de un elemento. | |
all | Todos los elementos hijo deben aparecer una única vez y pueden aparecer en cualquier orden. | |
choice | Solamente se permite escribir uno de los elementos hijo. | |
minOccurs | Número mínimo de veces que se debe utilizar un elemento | |
maxOccurs | Nú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.
Elemento | Descripción |
---|---|
group | Grupos de elementos. |
attributeGroup | Grupos 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" />