6 de dezembro de 2010

Criando Esquema para validar um XML - parte II

Depois de montar o cabeçalho do Esquema XSD, onde definimos um namespace e outros parâmetros para evitar choque de nomes com outros esquemas, podemos abordar a criação das regras de validação que orientarão como os elementos do XML devem ser criados.

Elementos são definidos num XSD usando-se a tag xs:element, que deve ser inserida entre a abertura e o encerramento da tag de cabeçalho. Um XSD pode definir basicamente dois tipos de elementos para o XML: os que contêm outros elementos aninhados são chamados de Complexos; os demais são chamados de Simples. O nó raiz do XML necessariamente será do tipo Complexo já que sempre haverão outros elementos aninhados nele.

Fica mais fácil trabalhando com um exemplo. Suponha, então, que estamos estabelecendo a estrutura de um XML a ser usado para carga do cadastro de produtos. Neste XML, as informações básicas do produto podem ser definidas no XSD como elementos simples. Segue um trecho extraído do XSD com essas definições:
<xs:element name="codigo" type="xs:string"/>
<xs:element name="deposito" type="xs:integer"/>
<xs:element name="saldo" type="xs:decimal"/>
<xs:element name="data_criacao" type="xs:date"/>

As linhas acima definem 4 elementos simples que devem aparecer no XML de produtos. A cada elemento é atribuído um nome e um tipo de dado - por enquanto, usei apenas tipos preestabelecidos pela W3C. Assim, o XML será considerado inválido se um elemento com qualquer outro nome estiver inserido nele ou se o tipo de dado esperado para cada elemento não corresponder à definição. O trecho de XML reproduzido abaixo está em conformidade com o XSD anterior:
<abc:codigo>000.001-8</abc:codigo>
<abc:deposito>1</abc:deposito>
<abc:saldo>220.34</abc:saldo>
<abc:data_criacao>2010-01-20</abc:data_criacao>

Os tipos complexos do XSD encapsulam declarações como as que fizemos no início deste post. Ao fazer isso, estabelecem também qual a sequência em que os elementos devem estar inseridos no XML. Declarar um elemento do tipo complexo exige o uso de duas novas tags: o xs:complexType - que substitui o atributo "type" usado para declarar os tipos simples - e o xs:sequence - que vai embutido no complexType e que encorpora as declarações dos demais elementos que compõem esse tipo complexo. Veja como fica a declaração do XSD para o exemplo do produto:
<xs:element name="produto">
<xs:complexType>
<xs:sequence>
<xs:element name="codigo" type="xs:string"/>
<xs:element name="deposito" type="xs:integer"/>
<xs:element name="saldo" type="xs:decimal"/>
<xs:element name="data_criacao" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>

Repare que a tag inicial é do tipo xs:element pois estamos definindo um novo elemento, ainda que do tipo complexo. O atributo name também é exigido aqui, enquanto o type foi eliminado para permitir que a declaração dos elementos seja feita de forma aninhada. O exemplo mostra apenas elementos de tipo simples aninhados no tipo complexo mas isso não é uma obrigação. Se for necessário, podemos aninhar outros tipos complexos também.

Como não estabelecemos nenhuma regra extra, todos os elementos definidos no nosso XSD tem que aparecer uma e somente uma vez no XML, isto é, esses elementos não podem ser omitidos nem aparecer duplicados. Caso contrário, o XML será considerado inválido.

Além disso, da forma como está declarado neste post, o XSD permite que apenas um produto seja incluído no XML. Num post futuro eu avanço no assunto, introduzindo novos conceitos para melhorar a declaração de tipos e enriquecer as validações, tornando-as mais precisas.

Um comentário :

Anônimo disse...

Muito bom!!!
Aguardo ancioso por novos posts.

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.