XSD - Guía rápida

La definición de esquema XML, comúnmente conocida como XSD, es una forma de describir con precisión el lenguaje XML. XSD verifica la validez de la estructura y el vocabulario de un documento XML con las reglas gramaticales del lenguaje XML apropiado.

Un documento XML se puede definir como:

  • Well-formed- Si se adhiere el documento XML en todo el XML Normas generales tales como etiquetas deben estar correctamente anidados, apertura y de cierre deben estar equilibrados, y las etiquetas vacías deben terminar con '/>', entonces se llama como bien formada .

    OR

  • Valid- Un documento XML que se dice que es válido cuando no solo está bien formado , sino que también se ajusta al XSD disponible que especifica qué etiquetas usa, qué atributos pueden contener esas etiquetas y qué etiquetas pueden aparecer dentro de otras etiquetas, entre otras propiedades .

El siguiente diagrama muestra cómo se usa XSD para estructurar documentos XML:

Aquí hay un código XSD simple. Mira esto.

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   targetNamespace = "http://www.tutorialspoint.com" 
   xmlns = "http://www.tutorialspoint.com"
   elementFormDefault = "qualified">

   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
            <xs:element name = 'student' type = 'StudentType' minOccurs = '0' 
               maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
   
</xs:schema>

Caracteristicas

Aquí hay una lista de algunas de las características populares de XSD:

  • Los XSD se pueden ampliar para futuras adiciones.
  • XSD es más rico y poderoso que DTD.
  • XSD está escrito en XML.
  • XSD admite tipos de datos.
  • XSD admite espacios de nombres.
  • XSD es la recomendación de W3C.

Un XML XSD se guarda en un documento separado y luego el documento se puede vincular a un documento XML para usarlo.

Sintaxis

La sintaxis básica de un XSD es la siguiente:

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   targetNamespace = "http://www.tutorialspoint.com"
   xmlns = "http://www.tutorialspoint.com" elementFormDefault = "qualified">
   
   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
            <xs:element name = 'student' type = 'StudentType' minOccurs = '0' 
               maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
   
</xs:schema>

Elemento <Schema>

El esquema es el elemento raíz de XSD y siempre es necesario.

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">

El fragmento anterior especifica que los elementos y tipos de datos utilizados en el esquema se definen en http://www.w3.org/2001/XMLSchema espacio de nombres y estos elementos / tipos de datos deben tener el prefijo xs. Siempre es obligatorio.

targetNamespace = "http://www.tutorialspoint.com"

El fragmento anterior especifica que los elementos utilizados en este esquema se definen en espacio de nombres. Es opcional.

xmlns = "http://www.tutorialspoint.com"

El fragmento anterior especifica que el espacio de nombres predeterminado es .

elementFormDefault = "qualified"

El fragmento anterior indica que cualquier elemento declarado en este esquema debe estar calificado como espacio de nombres antes de usarlo en cualquier documento XML. Es opcional.

Esquema de referencia

Eche un vistazo al siguiente esquema de referencia:

<?xml version = "1.0"?>

<class xmlns = "http://www.tutorialspoint.com"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd">  
   
   <student rollno = "393">    
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">	 
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">    
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>
xmlns = "http://www.tutorialspoint.com"

El fragmento anterior especifica la declaración de espacio de nombres predeterminada. El validador de esquemas utiliza este espacio de nombres y comprueba que todos los elementos forman parte de este espacio de nombres. Es opcional.

xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.tutorialspoint.com student.xsd">

Después de definir XMLSchema-instance xsi, use schemaLocationatributo. Este atributo tiene dos valores, espacio de nombres y ubicación del esquema XML, que se utilizarán separados por un espacio. Es opcional.

Usaremos un validador XSD basado en Java para validar students.xml en contra de students.xsd.

estudiantes.xml

<?xml version = "1.0"?>

<class>  
   <student rollno = "393">
      <firstname>Dinkar</firstname>    
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>	 
   </student>
   
   <student rollno = "493">	 
      <firstname>Vaneet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">    
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

estudiantes.xsd

<?xml version = "1.0"?>

<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   <xs:element name = 'class'>
      <xs:complexType>
         <xs:sequence>
             <xs:element name = 'student' type = 'StudentType' minOccurs = '0' 
                maxOccurs = 'unbounded' />
         </xs:sequence>
      </xs:complexType>
   </xs:element>

   <xs:complexType name = "StudentType">
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
      <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>			 
</xs:schema>

XSDValidator.java

import java.io.File;
import java.io.IOException;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;

import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

public class XSDValidator {
   public static void main(String[] args) {
      if(args.length !=2){
         System.out.println("Usage : XSDValidator <file-name.xsd> <file-name.xml>" );
      } else {
         boolean isValid = validateXMLSchema(args[0],args[1]);
         
         if(isValid){
            System.out.println(args[1] + " is valid against " + args[0]);
         } else {
            System.out.println(args[1] + " is not valid against " + args[0]);
         }
      }
   }
   
   public static boolean validateXMLSchema(String xsdPath, String xmlPath){
      try {
         SchemaFactory factory =
            SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = factory.newSchema(new File(xsdPath));
            Validator validator = schema.newValidator();
            validator.validate(new StreamSource(new File(xmlPath)));
      } catch (IOException e){
         System.out.println("Exception: "+e.getMessage());
         return false;
      } catch(SAXException e1){
         System.out.println("SAX Exception: "+e1.getMessage());
         return false;
      }
		
      return true;
   }
}

Pasos para validar XML contra XSD

  • Copia el XSDValidator.java archivar en cualquier ubicación, digamos E: > java

  • Copia el students.xml a la misma ubicación E: > java

  • Copia el students.xsd a la misma ubicación E: > java

  • Compilar XSDValidator.javausando la consola. Asegúrese de tener JDK 1.5 en adelante instalado en su máquina y que las rutas de clases estén configuradas. Para obtener detalles sobre cómo utilizar JAVA, consulte el tutorial de JAVA

E:\java\javac XSDValidator.java
  • Ejecutar XSDValidator con students.xsd y students.xml pasado como argumento.

E:\java\java XSDValidator students.xsd students.xml

Verificar la salida

Verá el siguiente resultado:

students.xml is valid against students.xsd

En este capítulo, veremos los tipos simples que define XSD.

S.No. Tipo y descripción simples
1

Elemento

El elemento simple solo puede contener texto. No puede contener ningún otro elemento.

2

Atributo

El atributo es en sí mismo un tipo y se utiliza en Elemento complejo.

3

Restricción

La restricción define los valores aceptables de un elemento XML.

El elemento complejo es un elemento XML que puede contener otros elementos y / o atributos. Podemos crear un elemento complejo de dos formas:

  • Defina un tipo complejo y luego cree un elemento usando el type atributo

  • Definir un tipo complejo directamente nombrando

Defina un tipo complejo y luego cree un elemento usando el atributo de tipo.

<xs:complexType name = "StudentType">
   <xs:sequence>
      <xs:element name = "firstname" type = "xs:string"/>
      <xs:element name = "lastname" type = "xs:string"/>
      <xs:element name = "nickname" type = "xs:string"/>
      <xs:element name = "marks" type = "xs:positiveInteger"/>
   </xs:sequence>
   <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
</xs:complexType>

<xs:element name = 'student' type = 'StudentType' />

Defina un tipo complejo directamente nombrando.

<xs:element name = "student">
   <xs:complexType>   
      <xs:sequence>
         <xs:element name = "firstname" type = "xs:string"/>
         <xs:element name = "lastname" type = "xs:string"/>
         <xs:element name = "nickname" type = "xs:string"/>
         <xs:element name = "marks" type = "xs:positiveInteger"/>
      </xs:sequence>
   <xs:attribute name = 'rollno' type = 'xs:positiveInteger'/>
   </xs:complexType>
<xs:element>

A continuación se muestra la lista de tipos complejos que admite XSD.

S.No. Tipo y descripción simples
1

Vacío

Complejo El elemento de tipo complejo vacío solo puede tener atributos pero no contenido.

2

Solo elementos

El elemento de tipo complejo solo elementos solo puede contener elementos

3

Solo texto

El elemento de tipo complejo de solo texto solo puede contener atributos y texto.

4

Mezclado

El elemento de tipo complejo mixto puede contener elemento, atributo y texto.

5

Indicadores

Los indicadores controlan las formas en que se organizarán los elementos en un documento XML.

6

<cualquier>

El elemento <any> se usa para elementos que no están definidos por el esquema

7

<cualquier atributo>

El atributo <anyAttribute> se usa para atributos que no están definidos por el esquema.

Los tipos de datos de cadena se utilizan para representar caracteres en los documentos XML.

<xs: string> tipo de datos

El tipo de datos <xs: string> puede tomar caracteres, avances de línea, retornos de carro y tabulaciones. El procesador XML no reemplaza los avances de línea, los retornos de carro y los caracteres de tabulación en el contenido con espacio y los mantiene intactos. Por ejemplo, se conservan varios espacios o tabulaciones durante la visualización.

<xs: string> Ejemplo

Declaración de elemento en xsd -

<xs:element name = "name" type = "xs:string"/>

Uso de elementos en xml -

<name>Dinkar</name>
<name>Dinkar    Kad</name>

<xs: token> tipo de datos

El tipo de datos <xs: token> se deriva del tipo de datos <string> y puede tomar caracteres, avances de línea, retornos de carro y tabulaciones. El procesador XML eliminará los avances de línea, las pestañas, los retornos de carro, los espacios iniciales y finales y varios espacios.

<xs: token> Ejemplo

Declaración de elemento en xsd -

<xs:element name = "name" type = "xs:token"/>

Uso de elementos en xml -

<name>Dinkar</name>
<name>Dinkar    Kad</name>

Tipos de datos de cadena

A continuación se muestra la lista de tipos de datos de uso común que se derivan del tipo de datos <string>.

S.No. Nombre y descripción
1

ID

Representa el atributo ID en XML y se usa en atributos de esquema.

2

IDREF

Representa el atributo IDREF en XML y se utiliza en atributos de esquema.

3

language

Representa una identificación de idioma válida

4

Name

Representa un nombre XML válido

5

NMTOKEN

Representa un atributo NMTOKEN en XML y se usa en atributos de esquema.

6

normalizedString

Representa una cadena que no contiene avances de línea, retornos de carro ni tabulaciones.

7

string

Representa una cadena que puede contener avances de línea, retornos de carro o tabulaciones.

8

token

Representa una cadena que no contiene avances de línea, retornos de carro, tabulaciones, espacios iniciales o finales, o espacios múltiples.

Restricciones

Los siguientes tipos de restricciones se pueden usar con tipos de datos de cadena:

  • enumeration
  • length
  • maxLength
  • minLength
  • pattern
  • whiteSpace

Los tipos de datos de fecha y hora se utilizan para representar la fecha y la hora en los documentos XML.

<xs: fecha> tipo de datos

El tipo de datos <xs: date> se utiliza para representar la fecha en formato AAAA-MM-DD.

  • YYYY - representa el año

  • MM - representa el mes

  • DD - representa el día

<xs: date> Ejemplo

Declaración de elemento en XSD -

<xs:element name = "birthdate" type = "xs:date"/>

Uso de elementos en XML -

<birthdate>1980-03-23</birthdate>

<xs: time> tipo de datos

El tipo de datos <xs: time> se utiliza para representar la hora en formato hh: mm: ss.

  • hh - representa horas

  • mm - representa minutos

  • ss - representa segundos

<xs: time> Ejemplo

Declaración de elemento en XSD -

<xs:element name = "startTime" type = "xs:time"/>

Uso de elementos en XML -

<startTime>10:20:15</startTime>

<xs: datetime> tipo de datos

El tipo de datos <xs: datetime> se utiliza para representar la fecha y la hora en formato AAAA-MM-DDThh: mm: ss.

  • YYYY - representa el año

  • MM - representa el mes

  • DD - representa el día

  • T - representa la sección de inicio de tiempo

  • hh - representa horas

  • mm - representa minutos

  • ss - representa segundos

<xs: datetime> Ejemplo

Declaración de elemento en XSD -

<xs:element name = "startTime" type = "xs:datetime"/>

Uso de elementos en XML -

<startTime>1980-03-23T10:20:15</startTime>

<xs: duration> tipo de datos

El tipo de datos <xs: duration> se utiliza para representar el intervalo de tiempo en formato PnYnMnDTnHnMnS. Cada componente es opcional excepto P.

  • P - representa la sección de inicio de la fecha

  • nY - representa el año

  • nM - representa el mes

  • nD - representa el día

  • T - representa la sección de inicio de tiempo

  • nH - representa horas

  • nM - representa minutos

  • nS - representa segundos

<xs: duration> Ejemplo

Declaración de elemento en XSD -

<xs:element name = "period" type = "xs:duration"/>

Uso de elementos en xml para representar un período de 6 años, 3 meses, 10 días y 15 horas.

<period>P6Y3M10DT15H</period>

Tipos de datos de fecha

A continuación se muestra la lista de tipos de datos de fecha más utilizados.

S.No. Nombre y descripción
1.

date

Representa un valor de fecha

2.

dateTime

Representa un valor de fecha y hora

3.

duration

Representa un intervalo de tiempo

4.

gDay

Representa una parte de una fecha como el día (DD)

5.

gMonth

Representa una parte de una fecha como el mes (MM)

6.

gMonthDay

Representa una parte de una fecha como mes y día (MM-DD)

7.

gYear

Representa una parte de una fecha como el año (AAAA)

8.

gYearMonth

Representa una parte de una fecha como el año y el mes (AAAA-MM)

9.

time

Representa un valor de tiempo

Restricciones

Los siguientes tipos de restricciones se pueden utilizar con los tipos de datos de fecha:

  • enumeration
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • pattern
  • whiteSpace

Los tipos de datos numéricos se utilizan para representar números en documentos XML.

<xs: decimal> tipo de datos

El tipo de datos <xs: decimal> se utiliza para representar valores numéricos. Admite números decimales de hasta 18 dígitos.

<xs: decimal> Ejemplo

Declaración de elemento en XSD -

<xs:element name = "score" type = "xs:decimal"/>

Uso de elementos en XML -

<score>9.12</score>

<xs: integer> tipo de datos

El tipo de datos <xs: integer> se utiliza para representar valores enteros.

<xs: integer> Ejemplo

Declaración de elemento en XSD -

<xs:element name = "score" type = "xs:integer"/>

Uso de elementos en XML -

<score>9</score>

Tipos de datos numéricos

A continuación se muestra la lista de tipos de datos numéricos de uso común.

S.No. Nombre y descripción
1.

byte

Un entero de 8 bits con signo

2.

decimal

Un valor decimal

3.

int

Un entero de 32 bits con signo

4.

integer

Un valor entero

5.

long

Un entero de 64 bits con signo

6.

negativeInteger

Un número entero que solo tiene valores negativos (.., - 2, -1)

7.

nonNegativeInteger

Un número entero que solo tiene valores no negativos (0,1,2, ..)

8.

nonPositiveInteger

Un número entero que solo tiene valores no positivos (.., - 2, -1,0)

9.

positiveInteger

Un número entero que solo tiene valores positivos (1,2, ..)

10.

short

Un entero de 16 bits con signo

11.

unsignedLong

Un entero de 64 bits sin signo

12.

unsignedInt

Un entero de 32 bits sin signo

13.

unsignedShort

Un entero de 16 bits sin signo

14.

unsignedByte

Un entero de 8 bits sin signo

Restricciones

Los siguientes tipos de restricciones se pueden utilizar con los tipos de datos de fecha:

  • enumeration
  • fractionDigits
  • maxExclusive
  • maxInclusive
  • minExclusive
  • minInclusive
  • pattern
  • totalDigits
  • whiteSpace

XSD tiene algunos otros tipos de datos importantes, como Boolean, binary, y anyURI.

<xs: boolean> tipo de datos

El tipo de datos <xs: boolean> se utiliza para representar el valor verdadero, falso, 1 (para verdadero) o 0 (para falso).

<xs: boolean> Ejemplo

Declaración de elemento en XSD -

<xs:element name = "pass" type = "xs:boolean"/>

Uso de elementos en XML -

<pass>false</pass>

Tipos de datos binarios

Los tipos de datos binarios se utilizan para representar valores binarios. Dos tipos binarios son de uso común.

  • base64Binary - representa datos binarios codificados en base64

  • hexBinary - representa datos binarios codificados en hexadecimal

<xs: hexbinary> Ejemplo

Declaración de elemento en XSD -

<xs:element name = "blob" type = "xs:hexBinary"/>

Uso de elementos en XML -

<blob>9FEEF</blob>

<xs: anyURI> tipo de datos

El tipo de datos <xs: anyURI> se utiliza para representar URI.

<xs: anyURI> Ejemplo

Declaración de elemento en XSD -

<xs:attribute name = "resource" type = "xs:anyURI"/>

Uso de elementos en XML -

<image resource = "http://www.tutorialspoint.com/images/smiley.jpg" />

Tipos de datos numéricos

A continuación se muestra la lista de tipos de datos numéricos de uso común.

S.No. Nombre y descripción
1.

byte

Un entero de 8 bits con signo

2.

decimal

Un valor decimal

3.

int

Un entero de 32 bits con signo

4.

integer

Un valor entero

5.

long

Un entero de 64 bits con signo

6.

negativeInteger

Un número entero que solo tiene valores negativos (.., - 2, -1)

7.

nonNegativeInteger

Un número entero que solo tiene valores no negativos (0,1,2, ..)

8.

nonPositiveInteger

Un número entero que solo tiene valores no positivos (.., - 2, -1,0)

9.

positiveInteger

Un número entero que solo tiene valores positivos (1,2, ..)

10.

short

Un entero de 16 bits con signo

11.

unsignedLong

Un entero de 64 bits sin signo

12.

unsignedInt

Un entero de 32 bits sin signo

13.

unsignedShort

Un entero de 16 bits sin signo

14.

unsignedByte

Un entero de 8 bits sin signo

Restricciones

Los siguientes tipos de restricciones se pueden usar con tipos de datos varios, excepto en el tipo de datos booleanos:

  • enumeration
  • length
  • maxLength
  • minLength
  • pattern
  • whiteSpace