Introdução
No primeiro artigo foi iniciada a apresentação da XML, enquanto o segundo artigo mostrou o que é um documento XML válido e como é possível validar-lo. Neste artigo você verá como criar um XML Schema (Esquema XML), mas como foi dito no segundo artigo, e não deve ser esquecido, um XML Schema também é um documento XML.
Relembrar é viver
Como mostrado no segundo artigo, o XML Schema por si só é um documento XML, logo, todas as regras aplicadas a um documento XML também devem ser aplicadas ao XML Schema. A grande diferença é que o XML Schema descreve a estrutura de documento XML, além de ser uma alternativa aos DTD (Document Type Definition - Definição de Tipos de Documento). O XML Schema é uma linguagem que também pode ser designada como XSD (XML Schema Definition - Definição de Esquema XML).
Já no primeiro artigo foi dito que um documento XML é usada para representar dados e não descrever aparência, como é feito pela HTML, sendo a XML o resultado de estudos do W3C (World Wide Web Consortium - Consórcio da Rede Mundial de Computadores).
Elemento da XML
Um elemento simples pode ser definido como um elemento XML que suporta apenas valores, enquanto um elemento complexo são divididos em 4 (quatro) categorias:
- Elementos vazios.
- Elementos que só contêm outros elementos.
- Elementos que só contêm valores.
- Elementos que contêm outros elementos e valores.
Obs.: No decorre do artigo a criação do arquivo XSD será baseado no namespace "http://www.w3.org/2001/XMLSchema", para maiores esclarecimentos leia o segundo artigo desta série.
A partir deste ponto o artigo será divido em exemplos explicados para facilitar a sua compreensão, seguindo a filosofia do nosso blog "Retirando dúvida de forma clara, objetiva e sem dá voltas".
O primeiro exemplo
Nesse exemplo será criado um documento para armazenar o nome e idade de uma pessoa.
<?xml version="1.0" encoding="UTF-8"?>
<pessoa>
<nome>Tadeu</nome>
<idade>42</idade>
</pessoa>
Explicando o documento
O documento informa que o arquivo terá um elemento raiz chamado pessoa, esse elemento raiz é do tipo complexo contendo dois elemento simples (nome e idade). O elemento nome tem o valor Tadeu já o elemento idade contém o valor 42. Este documento pode ser validado pelo esquema abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="pessoa">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="nome" type="xsd:string"/>
<xsd:element name="idade" type="xsd:integer"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Explicando o esquema
O XSD declara que o documento para ser válido deve ter um elemento complexo chamado pessoa, esse elemento complexo deve ter os elementos simples nome e idade, onde nome é do tipo xsd:string e idade do tipo xsd:integer.
Elemento: Omissão de Valor vs. Valor Fixo
Um elemento pode ter um valor omitido (default) ou fixo (fixed).<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
<xsd:element name="cor_1" type="xsd:string" default="vermelho"/>
<xsd:element name="cor_2" type="xsd:string" fixed="vermelho"/>
...
</xsd:schema>
Explicando o esquema
O esquema informa que o elemento cor_1 é do tipo xsd:string e se nada for especificado receberá o valor vermelho. O elemento cor_2 também é do tipo xsd:string e o seu valor vermelho não pode ser mudado.
Elemento: Definindo atributo
Um elemento pode ter nenhum, um ou vários atributos definidos.<?xml version="1.0" encoding="UTF-8"?>
<pessoa>
<nome>Tadeu</nome>
<idade>42</idade>
<apelido idioma="pt-br">Pereira</apelido>
</pessoa>
Explicando o documento
Esse documento já foi quase todo explicado, sendo acrescentado apenas o elemento apelido, que tem o atributo idioma com o valor pt-br.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
<xsd:element name="apelido">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:attribute name="idioma" type="xsd:string"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
...
</xsd:schema>
Explicando o esquema
O esquema define que o elemento apelido é do tipo simples, só aceita valores xsd:string e tem o atributo idioma que também só aceita valores xsd:string.
Atributo: Omissão de Valor vs. Valor Fixo
Assim como os elementos, os atributos podem ter um valor omitido (default) ou fixo (fixed).<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
<xsd:attribute name="idioma_1" type="xsd:string" fixed="pt-br"/>
<xsd:attribute name="idioma_2" type="xsd:string" default="en"/>
...
</xsd:schema>
Explicando o esquema
O atributo idioma_1 tem o valor fixo em pt-br, por sua vez, o atributo idioma_2 tem en como valor caso nada seja especificado.
Atributo: Opcional vs. Requerido
Um atributo pode ser opcional ou requerido (exigido, obrigatório).
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
<xsd:attribute name="idioma_1" type="xsd:string" use="required"/>
<xsd:attribute name="idioma_2" type="xsd:string" use="optional"/>
...
</xsd:schema>
Explicando o esquema
O atributo idioma_1 foi definido como uso obrigatório, já o atributo idioma_2 foi definido como uso opcional.
Faixa de valores
É possível especificar as faixas de valores que um elemento ou atributo pode receber.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
<xsd:element name="idade">
<xsd:simpleType>
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="20"/>
<xsd:maxInclusive value="70"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
...
</xsd:schema>
Explicando o esquema
O elemento idade pode ter valores do tipo xsd:integer compreendidos entre 20 (vinte) e 70 (setenta), incluído os mesmos.
Comprimento do valor
O tamanho mínimo e máximo de um valor (em caractere alfanumérico) pode ser determinado no esquema.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
<xsd:element name="password">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="5"/>
<xsd:maxLength value="10"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
...
</xsd:schema>
Explicando o esquema
O elemento password é do tipo xsd:string e deve ter no mínimo 5 (cinco) e no máximo 10 (dez) caracteres.
Padronizando valores
Os valores a serem incluídos podem ser restringidos por uma padronização definida no esquema.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...
<xsd:element name="letra">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[a-z]"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
...
<xsd:element name="telefone">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value=“3511-[0-9]{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
...
<xsd:element name="palavra">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="([a-z])*"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
...
<xsd:element name="sexo">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="m|f"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
...
</xsd:schema>
Explicando o esquema
O elemento letra é do tipo xsd:string e permite uma e somente uma única letra minúscula entre a e z, inclusive. O elemento telefone é do tipo xsd:string, devendo deve iniciar com os caracteres 3511, seguido por um traço, seguido por 4(quatro) dígitos entre 0 (zero) e 9 (nove), inclusive.
O elemento palavra é do tipo xsd:string, esse elemento aceita 0 (zero) ou mais ocorrências de letras minúscula entre a e z, inclusive. Por fim, o elemento sexo também é do tipo xsd:string e só aceita como valor a letra m ou f.
Conclusão
Neste artigo foram dados exemplos que podem ser estudados e incluídos na criação de um XML Schema, o próximo artigo continuará apresentando novos exemplos, mostrando como é possível criar um arquivo XSD robusto e de forma simples.
Se você ainda não leu o primeiro e o segundo artigo desta série, leia agora, pois eles são a base para esse artigo e para o próximo.
Até o próximo artigo.