XSD - Guia rápido

A definição de esquema XML, comumente conhecida como XSD, é uma maneira de descrever precisamente a linguagem XML. O XSD verifica a validade da estrutura e do vocabulário de um documento XML em relação às regras gramaticais da linguagem XML apropriada.

Um documento XML pode ser definido como -

  • Well-formed- Se o documento XML aderir a todas as regras XML gerais, como tags, devem ser aninhadas corretamente, as tags de abertura e fechamento devem ser balanceadas e as tags vazias devem terminar com '/>', então ele é chamado de bem formado .

    OR

  • Valid- Um documento XML considerado válido quando não é apenas bem formado , mas também está em conformidade com o XSD disponível que especifica quais tags ele usa, quais atributos essas tags podem conter e quais tags podem ocorrer dentro de outras tags, entre outras propriedades .

O diagrama a seguir mostra como o XSD é usado para estruturar documentos XML -

Aqui está um código XSD simples. Dê uma olhada nisto.

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

Características

Aqui está uma lista de alguns dos recursos populares do XSD -

  • Os XSDs podem ser extensíveis para adições futuras.
  • O XSD é mais rico e poderoso do que o DTD.
  • XSD é escrito em XML.
  • XSD suporta tipos de dados.
  • XSD oferece suporte a namespaces.
  • XSD é a recomendação W3C.

Um XML XSD é mantido em um documento separado e, em seguida, o documento pode ser vinculado a um documento XML para usá-lo.

Sintaxe

A sintaxe básica de um XSD é a seguinte -

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

O esquema é o elemento raiz do XSD e sempre é necessário.

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

O fragmento acima especifica que os elementos e tipos de dados usados ​​no esquema são definidos em http://www.w3.org/2001/XMLSchema namespace e esses elementos / tipos de dados devem ser prefixados com xs. É sempre necessário.

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

O fragmento acima especifica que os elementos usados ​​neste esquema são definidos em http://www.tutorialspoint.comnamespace. É opcional.

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

O fragmento acima especifica que o namespace padrão é http://www.tutorialspoint.com.

elementFormDefault = "qualified"

O fragmento acima indica que quaisquer elementos declarados neste esquema devem ser qualificados por namespace antes de serem usados ​​em qualquer documento XML. É opcional.

Esquema de Referência

Dê uma olhada no seguinte Esquema de Referência -

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

O fragmento acima especifica a declaração de namespace padrão. Este namespace é usado pelo validador de esquema para verificar se todos os elementos fazem parte deste namespace. É opcional.

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

Depois de definir a instância XMLSchema xsi, use schemaLocationatributo. Este atributo possui dois valores, namespace e localização do XML Schema, a serem usados ​​separados por um espaço. É opcional.

Usaremos validador XSD baseado em Java para validar students.xml contra o students.xsd.

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

students.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;
   }
}

Etapas para validar XML em relação ao XSD

  • Copie o XSDValidator.java arquivo para qualquer local, digamos E: > java

  • Copie o students.xml para o mesmo local E: > java

  • Copie o students.xsd para o mesmo local E: > java

  • Compilar XSDValidator.javausando o console. Certifique-se de ter o JDK 1.5 em diante instalado em sua máquina e os classpaths configurados. Para obter detalhes sobre como usar JAVA, consulte o Tutorial JAVA

E:\java\javac XSDValidator.java
  • Executar XSDValidator com students.xsd e students.xml passado como argumento.

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

Verifique a saída

Você verá o seguinte resultado -

students.xml is valid against students.xsd

Neste capítulo, veremos Tipos simples que o XSD define.

S.No. Tipo e descrição simples
1

Elemento

O elemento simples pode conter apenas texto. Não pode conter nenhum outro elemento.

2

Atributo

O atributo é um tipo e é usado no Elemento complexo.

3

Restrição

A restrição define os valores aceitáveis ​​de um elemento XML.

Elemento complexo é um elemento XML que pode conter outros elementos e / ou atributos. Podemos criar um elemento complexo de duas maneiras -

  • Defina um tipo complexo e, em seguida, crie um elemento usando o type atributo

  • Defina um tipo complexo diretamente nomeando

Defina um tipo complexo e, a seguir, crie um elemento usando o atributo type.

<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 um tipo complexo diretamente por nomenclatura.

<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 seguir está a lista de tipos complexos que o XSD suporta.

S.No. Tipo e descrição simples
1

Vazio

O elemento de tipo complexo vazio complexo pode ter apenas atributos, mas nenhum conteúdo.

2

Elementos Apenas

Elemento de tipo complexo apenas de elementos pode conter apenas elementos

3

Somente texto

O elemento de tipo complexo somente texto pode conter apenas atributo e texto.

4

Misturado

O elemento de tipo complexo misto pode conter elemento, atributo e texto.

5

Indicadores

Os indicadores controlam as maneiras como os elementos devem ser organizados em um documento XML.

6

O elemento <any> é usado para elementos que não são definidos pelo esquema

7

O atributo <anyAttribute> é usado para atributos que não são definidos pelo esquema.

Tipos de dados de string são usados ​​para representar caracteres nos documentos XML.

<xs: string> tipo de dados

O tipo de dados <xs: string> pode receber caracteres, avanços de linha, retornos de carro e caracteres de tabulação. O processador XML não substitui avanços de linha, retornos de carro e caracteres de tabulação no conteúdo por espaço e os mantém intactos. Por exemplo, vários espaços ou guias são preservados durante a exibição.

<xs: string> Exemplo

Declaração de elemento em xsd -

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

Uso de elemento em xml -

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

<xs: token> tipo de dados

O tipo de dados <xs: token> é derivado do tipo de dados <string> e pode receber caracteres, avanços de linha, retornos de carro e caracteres de tabulação. O processador XML removerá alimentações de linha, tabulações, retornos de carro, espaços à esquerda e à direita e vários espaços.

<xs: token> Exemplo

Declaração de elemento em xsd -

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

Uso de elemento em xml -

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

Tipos de dados de string

A seguir está a lista de tipos de dados comumente usados ​​que são derivados do tipo de dados <string>.

S.No. Nome e Descrição
1

ID

Representa o atributo de ID em XML e é usado em atributos de esquema.

2

IDREF

Representa o atributo IDREF em XML e é usado em atributos de esquema.

3

language

Representa um id de idioma válido

4

Name

Representa um nome XML válido

5

NMTOKEN

Representa um atributo NMTOKEN em XML e é usado em atributos de esquema.

6

normalizedString

Representa uma string que não contém avanços de linha, retornos de carro ou tabulações.

7

string

Representa uma string que pode conter avanços de linha, retornos de carro ou tabulações.

8

token

Representa uma string que não contém avanços de linha, retornos de carro, tabulações, espaços iniciais ou finais ou vários espaços

Restrições

Os seguintes tipos de restrições podem ser usados ​​com tipos de dados String -

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

Os tipos de dados de data e hora são usados ​​para representar a data e a hora nos documentos XML.

<xs: date> tipo de dados

O tipo de dados <xs: date> é usado para representar a data no formato AAAA-MM-DD.

  • YYYY - representa o ano

  • MM - representa o mês

  • DD - representa o dia

<xs: date> Exemplo

Declaração de elemento em XSD -

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

Uso de elemento em XML -

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

<xs: time> tipo de dados

O tipo de dados <xs: time> é usado para representar o tempo no formato hh: mm: ss.

  • hh - representa horas

  • mm - representa minutos

  • ss - representa segundos

<xs: time> Exemplo

Declaração de elemento em XSD -

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

Uso de elemento em XML -

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

<xs: datetime> tipo de dados

O tipo de dados <xs: datetime> é usado para representar a data e a hora no formato AAAA-MM-DDThh: mm: ss.

  • YYYY - representa o ano

  • MM - representa o mês

  • DD - representa o dia

  • T - representa o início da seção de tempo

  • hh - representa horas

  • mm - representa minutos

  • ss - representa segundos

<xs: datetime> Exemplo

Declaração de elemento em XSD -

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

Uso de elemento em XML -

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

<xs: duração> tipo de dados

O tipo de dados <xs: duration> é usado para representar o intervalo de tempo no formato PnYnMnDTnHnMnS. Cada componente é opcional, exceto P.

  • P - representa o início da seção de data

  • nY - representa o ano

  • nM - representa o mês

  • nD - representa o dia

  • T - representa o início da seção de tempo

  • nH - representa horas

  • nM - representa minutos

  • nS - representa segundos

<xs: duração> Exemplo

Declaração de elemento em XSD -

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

Uso do elemento em xml para representar período de 6 anos, 3 meses, 10 dias e 15 horas.

<period>P6Y3M10DT15H</period>

Tipos de dados de data

A seguir está a lista de tipos de dados de data comumente usados.

S.No. Nome e Descrição
1

date

Representa um valor de data

2

dateTime

Representa um valor de data e hora

3 -

duration

Representa um intervalo de tempo

4

gDay

Representa uma parte de uma data como o dia (DD)

5

gMonth

Representa uma parte de uma data como o mês (MM)

6

gMonthDay

Representa uma parte de uma data como o mês e dia (MM-DD)

7

gYear

Representa uma parte de uma data como o ano (AAAA)

8

gYearMonth

Representa uma parte de uma data como o ano e mês (AAAA-MM)

9

time

Representa um valor de tempo

Restrições

Os seguintes tipos de restrições podem ser usados ​​com os tipos de dados Date -

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

Tipos de dados numéricos são usados ​​para representar números em documentos XML.

<xs: decimal> tipo de dados

O tipo de dados <xs: decimal> é usado para representar valores numéricos. Ele suporta números decimais de até 18 dígitos.

<xs: decimal> Exemplo

Declaração de elemento em XSD -

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

Uso de elemento em XML -

<score>9.12</score>

<xs: integer> tipo de dados

O tipo de dados <xs: integer> é usado para representar valores inteiros.

<xs: integer> Exemplo

Declaração de elemento em XSD -

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

Uso de elemento em XML -

<score>9</score>

Tipos de dados numéricos

A seguir está a lista de tipos de dados numéricos comumente usados.

S.No. Nome e Descrição
1

byte

Um inteiro assinado de 8 bits

2

decimal

Um valor decimal

3 -

int

Um inteiro assinado de 32 bits

4

integer

Um valor inteiro

5

long

Um inteiro assinado de 64 bits

6

negativeInteger

Um número inteiro tendo apenas valores negativos (.., - 2, -1)

7

nonNegativeInteger

Um número inteiro tendo apenas valores não negativos (0,1,2, ..)

8

nonPositiveInteger

Um número inteiro tendo apenas valores não positivos (.., - 2, -1,0)

9

positiveInteger

Um número inteiro tendo apenas valores positivos (1,2, ..)

10

short

Um inteiro assinado de 16 bits

11

unsignedLong

Um inteiro não assinado de 64 bits

12

unsignedInt

Um inteiro não assinado de 32 bits

13

unsignedShort

Um inteiro não assinado de 16 bits

14

unsignedByte

Um inteiro sem sinal de 8 bits

Restrições

Os seguintes tipos de restrições podem ser usados ​​com os tipos de dados Date -

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

XSD tem alguns outros tipos de dados importantes, como Boolean, binary, e anyURI.

tipo de dados <xs: boolean>

O tipo de dados <xs: boolean> é usado para representar o valor verdadeiro, falso, 1 (para verdadeiro) ou 0 (para falso).

<xs: boolean> Exemplo

Declaração de elemento em XSD -

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

Uso de elemento em XML -

<pass>false</pass>

Tipos de dados binários

Os tipos de dados binários são usados ​​para representar valores binários. Dois tipos binários são comuns em uso.

  • base64Binary - representa dados binários codificados em base64

  • hexBinary - representa dados binários codificados hexadecimais

<xs: hexbinary> Exemplo

Declaração de elemento em XSD -

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

Uso de elemento em XML -

<blob>9FEEF</blob>

<xs: anyURI> tipo de dados

O tipo de dados <xs: anyURI> é usado para representar URI.

<xs: anyURI> Exemplo

Declaração de elemento em XSD -

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

Uso de elemento em XML -

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

Tipos de dados numéricos

A seguir está a lista de tipos de dados numéricos comumente usados.

S.No. Nome e Descrição
1

byte

Um inteiro assinado de 8 bits

2

decimal

Um valor decimal

3 -

int

Um inteiro assinado de 32 bits

4

integer

Um valor inteiro

5

long

Um inteiro assinado de 64 bits

6

negativeInteger

Um número inteiro tendo apenas valores negativos (.., - 2, -1)

7

nonNegativeInteger

Um número inteiro tendo apenas valores não negativos (0,1,2, ..)

8

nonPositiveInteger

Um número inteiro tendo apenas valores não positivos (.., - 2, -1,0)

9

positiveInteger

Um número inteiro tendo apenas valores positivos (1,2, ..)

10

short

Um inteiro assinado de 16 bits

11

unsignedLong

Um inteiro não assinado de 64 bits

12

unsignedInt

Um inteiro não assinado de 32 bits

13

unsignedShort

Um inteiro não assinado de 16 bits

14

unsignedByte

Um inteiro sem sinal de 8 bits

Restrições

Os seguintes tipos de restrições podem ser usados ​​com tipos de dados diversos, exceto no tipo de dados booleano -

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