30 de novembro de 2010

Criando Esquema para validar um XML - parte I

Há dois aspectos que devemos observar num XML para podermos considerá-lo válido. O primeiro aspecto é obrigatório e está relacionado com a forma com a qual a estrutura básica do XML está montada, isto é, se os elementos (tags) existentes estão contidos entre um par < e >, se os elementos de abertura estão devidamente fechados, se a abertura e o fechamento dos elementos ocorrem na ordem correta, respeitando a hierarquia interna, etc. Em suma, há uma sintaxe bem definida para a construção de XMLs e eles só serão válidos se forem construídos de acordo com ela. Quando o XML atende este requisito, diz-se que ele está bem formado.

O segundo aspecto é opcional mas constitui uma ferramenta poderosa para garantir que um XML bem formado que tenhamos em mãos atenda um propósito específico. Estamos falando aqui da semântica do XML, ou seja, do significado que o conteúdo dele tem em um determinado contexto. Tendo a certeza de que o XML contém os elementos que esperamos e que os valores inseridos nestes elementos estão condizentes com regras estabelecidas por nós mesmos, o XML poderá ser utilizado sem sustos por uma aplicação que dependa de tais regras para funcionar adequadamente. É, portanto, também uma forma de padronizar a distribuição das informações. A Nota Fiscal Eletrônica é um bom exemplo da utilidade dos esquemas já que todas as notas enviadas à Receita Federal devem estar no formato XML apropriado, conforme a definição contida nos esquemas publicados pela própria Receita.

A validação sintática pode ser feita carregando o XML como uma estrutura DOM - Document Object Model - presente nas linguagens de programação mais usadas atualmente. Já a validação semântica depende da criação de um arquivo externo, construído de acordo com uma estrutura chamada XSD - XML Schema Definition - que serve para descrever a estrutura de um documento XML. Neste arquivo são colocadas regras tais como os nomes dos elementos esperados para o XML, a hierarquia entre esses elementos (isto é, quais nós devem estar inseridos em outro), presença de atributos nos elementos, o tipo de valor aceito pelos elementos, etc.

Um XSD é também um tipo de XML mas, assim como o HTML, tem uma semântica própria que deve ser respeitada. Isso significa que há um conjunto de tags específicas para a construção do XSD, a começar pelo cabeçalho do documento. Segue um exemplo típico de declaração do cabeçalho:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.abc71.com.br"
xmlns="http://www.abc71.com.br"
elementFormDefault="qualified">
.
.
.
</xs:schema>

A tag schema é o nó raiz onde toda a descrição de estrutura de um XML será feita. Mas qual o significado dos atributos que estão acompanhando a declaração da tag ? O primeiro deles - xmlns:xs - indica que a declaração do esquema seguirá as regras definidas no namespace do consórcio W3C, cujo nome é "http://www.w3.org/2001/XMLSchema". Também define um apelido para esse namespace, que passa a ser identificado internamente no XSD como xs. Assim, o prefixo xs é usado para indicar tags pertencentes ao domínio desse namespace, como em xs:schema.

Os dois próximos atributos estão relacionados a nosso próprio namespace. O targetNamespace define o namespace ao qual os elementos de nosso XML estão vinculados, enquanto o xmlns sinaliza o namepace padrão para o XML, isto é, o que deve ser usado quando um não for explicitamente apontado. O conceito de namespace é relativamente simples: a grosso modo, ele isola os nomes usados por nós daqueles usados por outros namespaces. Assim, mesmo que algum dos nomes usados por nós também exista em outro namespace, ambos são considerados diferentes por estarem inseridos em contextos (namespaces) distintos.

O atributo elementFormDefault indica se, quando construirmos um XML segundo esse XSD, os elementos do namespace devem ser qualificados ou não. Isto é, se devemos obrigatoriamente especificar o namespace na declaração de um elemento ou se isso é subentendido.

O XML deve, no entanto, referenciar o namespace no elemento a partir do qual as regras do XSD são aplicadas. Em outras palavras, o XML deve indicar o namespace com o qual está trabalhando de modo que uma validação contra o XSD é possível. Supondo que o nó raiz determinado por nosso XSD tenha o nome de items, a declaração do XML seria:
<?xml version="1.0"?>
<items xmlns="http://www.abc71.com.br">
.
.
.
</items>

Há outros atributos permitidos na tag schema e eles serão apresentados conforme for surgindo a necessidade. Nos próximos posts, tratarei da declaração da sequência de tags e da definição de tipos dentro de um XSD.

Nenhum comentário :

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.