Como implementar um esquema XML

Neste artigo, vamos ver como um pode criar um esquema XML. Para compreender os esquemas XML (extensible markup language), vamos rever as noções básicas de XML nesta introdução. Espera-se que você tenha um entendimento básico de XML para este como-fazer.

XML- Extensible Markup Language é um texto baseado em linguagem multi-plataforma que permite que você armazene dados (como endereços em um catálogo de endereços) de uma forma estruturada. O documento XML deverá ter a sintaxe correta. Portanto, quando fizer documentos XML, eles devem ser bem-formulados. Um documento bem-formulado tem o seguinte texto:

    Tags fechadas (<olá> </olá> ou <oi/>)

    Um elemento do atributo deve estar entre aspas (<preço doce="0.50">)

    XML é sensível a maiúsculas. Em outras palavras, o início e o fim da tag deverão ser em minúsculas

Um exemplo muito simples de um documento XML é apresentado a seguir para um menu de uma doceria.

<?xml version="1.0" encoding="utf-8"?>
<doceria>
<doce>
<productName company="XYZ">pirulitos</name>
<id>634847</ id>
<price>0,50</ price>
</doce>
<doce>
<productName company="ABC">Pastilhas</ name>
<id>634812</ id>
<price> 0,75 </ price>
</doce>
</doceria>

A primeira afirmação é a instrução de processamento. Ela diz ao analisador que estamos trabalhando com uma determinada versão de XML. O resto do documento é composto de nossas marcas e elementos. No exemplo acima, o elemento "nome" tem um atributo de "empresa". Uma ótima maneira de lembrar um atributo é pensar nele como uma propriedade que algo pode ter. Um doce tem um nome. O nome está associado a uma determinada empresa.

Em nosso como-fazer nós vamos pegar o exemplo acima e criar um esquema XML para ele que vai definir as regras para como o nosso elemento de conteúdo, ou dados, em outras palavras, deve ser inserido. (Por exemplo, qual é o formato esperado para a nossa id? Pode ter caracteres alfabéticos?)

Esquema XML - Um esquema XML declara metadados que atribui um tipo particular, seja ele simples ou complexo, para os elementos e seus atributos em um documento XML.

Passo 1:

Vamos dar uma olhada novamente em nosso exemplo para a doceria.

<?xml version="1.0" encoding="utf-8"?>
<doceria>
<doce>
<productName company="XYZ">pirulitos</name>
<id>634847</ id>
<price>0,50</ price>
</doce>
<doce>
<productName company="ABC">Pastilhas</ name>
<id>634812</ id>
<price> 0,75 </ price>
</doce>
</doceria>

Nosso elemento doceria  tem dois sub-elementos doce. Cada elemento doce  tem os subelementos do nome, id, e preço. Ele também tem um atributo chamado company (empresa). Ao construir as regras de sintaxe, temos de definir limites para o formato de nossos dados. Estas restrições podem ser baseadas em como os dados serão utilizados. Se, por exemplo, a nossa ID do doce couber em uma fatura do produto dentro de 6 caracteres, então isso irá ajudar a determinar as nossas limitações. Faça a si mesmo a algumas perguntas sobre os seus dados:

1. Os dados têm que ser apenas números ou letras alfabéticas?
2. Os dados têm que ter uma determinada extensão? Ou uma extensão mínima ou máxima mais especificamente?
3. Será que os dados têm que ter um determinado atributo ou subelemento especificados? Ou são opcionais?

Agora que temos algumas idéias sobre o que perguntar a nós mesmos, nós podemos avançar. Vamos construir um conjunto de regras, antes de começar criar o nosso esquema em código XML.

1. O nome do doce é necessário.
2. O nome da empresa não pode ser superior a 30 caracteres. É opcional.
3. O id deve ser todo numérico e deve ter exatamente 6 dígitos. É obrigatório.
4. O preço é obrigatório.

Passo 2:

Com a nossa lista de regras, podemos agora criar o nosso esquema. Primeiro de tudo temos de apresentar uma declaração do nosso namespace chamado xsd. Podemos usar qualquer nome que queremos como docexsd, mas xsd é curto e fácil de compreender. O termo xsd irá ser utilizado como um prefixo em todo o nosso esquema para especificar nosso namespace.

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Dentro de seu esquema você precisa definir cada elemento como um tipo particular. Existem 2 tipos que você pode usar:

Simples:
<xsd:element name=" nameofelement "type=" nameofbuilt-insimpletype ">

Ou

<xsd:simpleType name=" nameofSimpleType ">
derived type constraints...
</ xsd: simpleType>
Complexo:
<xsd:complexType name=" nameofComplexType ">
<xsd:sequence>
elementos ...
</xsd: sequence>
</xsd: complexType>

A diferença entre os 2 é muito simples. Um tipo simples não pode ter conteúdo de atributos ou elemento.

No passo 3, vamos repassar o tipo simples.

Passo 3:

Agora que você está familiarizado com os tipos de elemento, vamos ver alguns tipos built-in.

    data
    string
    decimal
    time
    integer, long, int, positiveInteger, double, float

Você pode ver a lista completa dos tipos simples built-in.

Com um tipo built-in pode-se criar um tipo simples como o preço ou id que não tenham um atributo ou um subelement.

<xsd:element name="price" type="xsd:decimal" />
<xsd:element name="id" type="positiveInteger"/>

Passo 4:


A foto mostrada ilustra a estrutura do nosso esquema em linguagem XML. Precisamos construir o tipo complexo e adicionar limitações no tamanho para o nosso preço e id. Para certificar-se de nossa id e o atributo empresa tenham um formato específico, vamos criar 2 tipos simples. Vamos atribuir o tipo de id idType. O atributo empresa será atribuído o tipo companyType.

<xsd:simpleType name="idType">
<xsd:restriction base="xsd:positiveInteger">
<xsd:totalDigits value="6"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="companyType">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="30"/>
</xsd:restriction>
</xsd:simpleType>

A tag restriction dentro do elemento tipo simples nos permite declarar informações relativas à faceta do nosso modelo simples. Uma faceta restringe um tipo simples. Podemos afirmar coisas como o total de dígitos para um valor numérico para o comprimento mínimo para o nosso valor de string. Certifique-se de referir a facetas de tipos simples built-in  para a lista. O atributo base especifica os tipos de restrições que podem ser aplicadas. Em outras palavras, não seria válido usar maxlength com todos os valores numéricos como decimal ou duplo. A faceta totalDigits é para isso.

Passo 5:

Agora você precisa construir o seu tipo complexo que irá conter todos os outros. Se bem se lembram de mais cedo, o seu tipo complexo pode ter sub-elementos e atributos. Nosso elemento doceria  tem o sub-elemento doce. O elemento doce tem três sub-elementos (ProductName, preço e id). O elemento ProductName tem um atributo, pois ele precisa ser construído para acomoda-lo e seu valor.

Nosso elemento doceria contém tudo:

<xsd:element name="doceria" type="doceriaType"/>
<xsd:complexType name="doceriaType">
<xsd:sequence>
<xsd:element name="doce" type="doceType" minOccurs="0" maxOccurs="unbounded"/>
</ xsd: sequence>
</ xsd: complexType>

Em primeiro lugar, nós declaramos um elemento doceria, que é um complexType. Se você recordar, o nosso elemento doce pode ser repetido quantas vezes desejar. Isso é onde os nossos atributos minOccurs e maxOccurs aparecem. Eles vêm especificar as ocorrências máximas e mínimas. Digamos, por exemplo, que você só o queria uma vez ou nenhuma vez. Então minOccurs poderá ainda ser 0 e maxOccurs seria 1. Nosso sub-elemento doce é declarado como um tipo chamado doceType. Este é bem grande.

<xsd:complexType name="candyType">
<xsd:sequence>
elemento ProductName vai aqui... Explicado a seguir...
<xsd:element name="id" type="idType" minOccurs="1" maxOccurs="1"/>
<xsd:element name="price" type="xsd:decimal" minOccurs="1" maxOccurs="1"/>
</xsd: sequence>
</xsd: complexType>

Você se lembra da informação simpleType para a nossa id? Aqui se refere ao seu tipo, que foi chamado idType.

Aqui está o elemento ProductName que foi cortado de cima, para que pudesse ser explicado.

<xsd:element name="productName" minOccurs="1" maxOccurs="1">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="company" type="companyType"/>
</ xsd: extension>
</ xsd: simpleContent>
</ xsd: complexType>
</ xsd: element>

Dentro do elemento de tags ProductName nós declaramos um complexType. Temos que ser capazes de colocar um valor string para o elemento ProductName, portanto precisamos de declarar um tipo simpleContent. Isso nos permitirá ter restrições ou ampliações no nosso complexType baseado em texto. Se nós não tomarmos estas medidas, nós não seriamos capazes de colocar o texto para o nome do doce entre as tags ProductName. No nosso caso, queremos ser capazes de colocar em um valor de string. Além disso, temos uma extensão para o nosso atributo chamado empresa que necessita ser declarado. O atributo base para o elemento extensão acima especifica nosso tipo de dados built-in (ou seja, seqüência, tempo, etc), um simpleType, ou complexType. Depois de juntar tudo, está pronto!

Certifique-se que o XSD tem esse arquivo no topo:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

E o xsd: tag esquema deve ser fechada com </ xsd: schema> no final depois de tudo.

Pegue o seu arquivo completo XSD e nomeie-o doceria.xsd. É válido e bem formulado.

Passo 6:

Nosso último passo é aplicar o nosso esquema XML ao nosso arquivo XML original.

doceria.xml


<?xml version="1.0" encoding="UTF-8"?>
<doceria xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="doceria.xsd">
<doce>
<productName company="XYZ">pirulitos</ ProductName>
<id>634847</id>
<price>0,50</price>
</doce>
<doce>
<productName company="ABC">Pastilhas</ ProductName>
<id>634812</id>
<price>0,75</ price>
</doce>
</doceria>

doceria.xsd


<? xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="doceria" type="doceriaType"/>
<xsd:complexType name="doceriaType">
<xsd:sequence>
<xsd:element name="doce" type="doceType" minOccurs="0" maxOccurs="unbounded"/>
</xsd: sequence>
</xsd: complexType>

<xsd:complexType name="doceType">
<xsd:sequence>
<xsd:element name="productName" minOccurs="1" maxOccurs="1">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="company" type="companyType"/>
</ xsd: extension>
</ xsd: simpleContent>
</ xsd: complexType>
</ xsd: element>

<xsd:element name="id" type="idType" minOccurs="1" maxOccurs="1"/>
<xsd:element name="price" type="xsd:decimal" minOccurs="1" maxOccurs="1"/>
</ xsd: sequence>
</ xsd: complexType>

<xsd:simpleType name="idType">
<xsd:restriction base="xsd:positiveInteger">
<xsd:totalDigits value="6"/>
</ xsd: restriction>
</ xsd: simpleType>
<xsd:simpleType name="companyType">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="30"/>
</ xsd: restriction >
</ xsd: simpleType>
</ xsd: schema>

Nota:
Certifique-se de todo o seu esquema XML está dentro das tags <xsd:schema> </xsd:schema>.