# XML Schema

XML Schema é uma linguagem baseada no formato XML para definição de regras de validação ("esquemas") em documentos no formato XML. Foi a primeira linguagem de esquema para XML a obter o status de recomendação por parte do W3C. Esta linguagem é uma alternativa ao DTD, cuja sintaxe não é baseada no formato XML.
Foi amplamente utilizado para desenvolvimento da NF-e (Nota Fiscal Eletrônica) Brasileira.
Um arquivo contendo as definições na linguagem XML Schema é chamado de XSD (XML Schema Definition), este descreve a estrutura de um documento XML.

## História

Em meados de 1999, o consórcio W3C (responsável por vários padrões da WEB) publicou pela primeira vez o XML Schema. Sendo a primeira iniciativa de apresentar uma alternativa ao padrão DTD. Após diversas revisões, em 2001, foi lançada a recomendação final do XML Schema e em 2004 houve algumas adaptações. Dessa data até hoje, diversos fabricantes tem incluído esse padrão em seus produtos. Existem diversas APIs para validação, bancos de dados que dão suporte a tipos de dados XML, além de bancos de dados nativos que trabalham apenas com XML e tem o XML Schema como seu mecanismo básico de controle de consistência.

## Padrões de Validação

A validação de arquivos XML pode ser através de uma aplicação própria ou ainda algum outro padrão adotado. Os principais padrões atualmente são:
* DTD (Document Type Definition)
* XSD (XML Schema Definition)
* XDR (XML Data Reduced)
Quando um documento XML é bem formado, ele pode ser validado com base em regras que podem ser definidas utilizando a linguagem XML Schema.
A utilização de DTDs teve grande importância quando o padrão XML surgiu. Pois era o padrão para validação de documentos da linguagem antecessora da XML (o SGML) e foi utilizada como forma de validação também para o XML. Embora seja capaz de realizar a validação de arquivos XML, a DTD possui muitas limitações. Não existe um conjunto amplo de tipos (todos os dados são interpretados como texto), trazendo efeitos desagradáveis como validação, comparação, etc. Também não suportam espaços de nomes (namespace), forçam que os elementos sempre apareçam na ordem especificada, etc. Levando ao desuso.
O padrão XSD (XML Schema Definition) ou XS (XML Schema) é a recomendação oficial do W3C desde 2001 para validação. Esse padrão consegue suprir as limitações da DTD, além de fornecer diversas funcionalidades, é possível construir tipos próprios derivados dos tipos básicos, realizar relacionamentos entre elementos de dados dentro do XML (similar aos relacionamentos entre tabelas), etc.

## Estrutura de um documento XSD

Em sua essência é um documento XML. Isso é, deve obedecer as mesmas regras que um documento XML. Um documento XSD também possui outras necessidades que um documento XML não necessita. Para que essas necessidades sejam atendidas é preciso definir as partes de um documento XSD.

### Declaração de elementos

Os elementos são declarados utilizando-se a tag “element”. Os principais atributos da tag são:
* name: especifica o nome do elemento
* type: especifica o tipo de dados do elemento
* minOccurs: especifica o mínimo de vezes que o elemento pode aparecer
* maxOccurs: especifica o máximo de vezes que o elemento pode aparecer (a palavra unbounded pode ser utilizada para especificar uma quantidade ilimitada).
A declaração abaixo cria um elemento chamado “endereco” tipo string, que pode aparecer no mínimo zero (0) vezes e no máximo uma (1) vez:

### Declaração de atributos

De uma forma geral as declarações de atributos se parecem muito com as declarações de elementos. Essas declarações possuem alguns atributos. Os principais são:
* name: especifica o nome do atributo
* type: especifica o tipo de dados do atributo
* use: especifica a utilização do atributo (requerido, opcional ou proibido)
Ex.: declara dois atributos. O primeiro é do tipo data e é opcional. O segundo é do tipo string e é obrigatório.
A declaração use padrão é "optional".

### Tipos de Dados

O XML Schema possui diversos tipos de dados, além da possibilidade de criar tipos próprios, os mais comuns são:
* xsd:string – string de caracteres de comprimento ilimitado
* xsd:boolean – valor booleano (true (1) ou false (0))
* xsd:decimal – número decimal
* xsd:float – ponto flutuante
* xsd:date – Uma data no calendário gregoriano
* xsd:dateTime – Um instante específico no calendário gregoriano
* xsd:integer – Um número inteiro
Obs.: esses dados podem ser utilizados tanto com os elementos quanto com os atributos.

### Grupos de modelos

Permitem que elementos sejam especificados dentro de outros elementos e, obedeçam a uma ordem ou escolha específica através de conectores (opcional). Os três conectores permitidos são: sequence, all e choice.
Ex. 1: a utilização do conector sequence; nesse caso é especificado que todos os três elementos apareçam na ordem correta. Se a ordem não for obedecida ocorrerá erro.
Ex. 2: a utilização do conector all; nesse caso é obrigado apenas que os elementos constem no documento, mas não necessariamente em uma ordem. Qualquer ordem especificada é permitida.
Ex. 3: a utilização do conector choice; nesse caso é obrigatório apenas que um e somente um dos elementos especificados conste no documento. Se os dois elementos aparecerem, ocorrerá um erro.
A utilização de conectores é necessária para a construção de elementos compostos. Esses tipos de elementos são combinações de tags aninhadas chamados de elementos complexos. Para que esses elementos sejam declarados é necessário utilizar tag “complexType”.
Existem cinco conjuntos de tipos de dados pré-definidos em XSD. Esses conjuntos de tipos de dados são: