17 de janeiro de 2011

Criando Esquema para validar um XML - parte V

Nos exemplos incluídos no último post, as regras de validação se baseiam na especificação de uma cadeia de caracteres permitidos, sendo que cada posição no texto final tem que estar declarada na regra. Embora isso resolva as situações em que o tamanho do texto exigido é fixo - como no caso do código de um produto - , é bastante inconveniente termos que declarar cada caracter quando o tamanho do texto é muito grande. Isso é especialmente verdade quando as regras para cada caracter se repetem ao longo do padrão.

Imagine, por exemplo, criar a regra de validação para um campo texto de 255 caracteres em que apenas letras maiúsculas e dígitos são aceitos. Pela forma apresentada no outro post, teríamos que repetir 255 vezes o padrão aceito em cada posição : "[A-Z0-9]". Para resolver isso de uma forma mais elegante, a sintaxe para restrições do XSD fornece um recurso que nos permite estabelecer critérios para repetições em parte do padrão - ou nele todo, se isso for necessário.

Critérios para repetições são adicionados à direita do caracter - ou caracteres - que se quer repetir. Os símbolos válidos e seus significados são listados a seguir :
* Um asterisco indica que o(s) caractere(s) à esquerda dele pode(m) ser repetido(s) quantas vezes forem necessárias, incluindo zero. Isto é, o padrão associado ao asterisco pode ser omitido e ainda assim o valor será considerado válido. Por exemplo, aplicar o padrão abaixo a um campo num XML permitiria valores válidos desde um texto vazio até a ocorrência de quantas letras minúsculas, maiúsculas ou dígitos desejássemos:
<xs:pattern value="[azA-Z0-9]*" />

+ O sinal de "mais" sinaliza que o padrão à esquerda dele deve ser repetido uma ou mais vezes para que o valor no XML seja aceito. Assim, é obrigatório que o padrão ocorra ao menos uma vez. No exemplo abaixo, é obrigatória a ocorrência de ao menos um dígito mas não há limite máximo de quantidade de dígitos para um valor ser válido:
<xs:pattern value="[0-9]+" />

? Uma interrogação sinaliza que o padrão à esquerda é opcional, isto é, ele pode ser omitido mas se for incluído deve aparecer uma única vez. O padrão abaixo permite que se informe um dígito, uma letra X maiúscula ou que se omita o valor:
<xs:pattern value="[0-9X]?" />

{n} Especificar um número entre chaves determina uma quantidade exata de repetições do padrão. No caso do código de produto, poderíamos criar uma regra como a que segue para que tal código tenha obrigatoriamente 14 caracteres, que podem ser letras maiúsculas ou dígitos:
<xs:pattern value="[A-Z0-9]{14}" />

Esta sintaxe também permite fixar limites mínimos e máximos de repetição do padrão, bastando separar o valor desses limites por uma vírgula. Assim, informar {2,4} determina que o padrão deve ocorrer no mínimo 2 vezes e no máximo 4, enquanto informar {3,} obriga a ocorrência do padrão no mínimo 3 vezes, sem especificar um limite máximo.

Para associar uma regra de repetição a vários caracteres, declare o padrão desejado entre parênteses. Assim, todo o padrão interno terá que respeitar a regra de repetição. O padrão abaixo, por exemplo, dita que um valor para ser válido tem que ser composto por um ou mais pares de caracteres, o primeiro sendo um letra maiúscula e o segundo sendo um dígito :
<xs:pattern value="([A-Z][0-9])+" />

É importante ressaltar ainda que todas as regras descritas nos posts sobre a restrição do tipo pattern num XSD podem ser combinadas para gerar regras mais complexas. É possível até mesmo criar uma lista de padrões aceitos para um determinado valor, ligando as diversas regras com um caracter | (que significa "OU"). Quando houver uma lista fixa de valores aceitáveis, eles também podem ser declarados num pattern separados pelo caracter |:
<xs:pattern value="casado|solteiro|divorciado|viúvo" />

Um outro aspecto a se preocupar na criação de regras é o que fazer quando espaços em branco - incluindo quebras de linhas e tabulações - são informados no valor. O default é manter todos esses caracteres a aplicar também a eles as restrições de sequência estabelecidas. Mas, através da tag xs:whiteSpace, é possível fazer com que todos eles sejam substituidos por espaços em branco simples antes de aplicar a regra de sequência (valor replace) ou remover completamente esses espaços no começo e no fim do texto, além de juntar num único espaço as duplicidades que aparecerem no meio :
<xs:whiteSpace value="collapse" />
O xs:whiteSpace pode ser combinado na mesma restrição com outras tags, como o xs:pattern e o xs:minLength.

Mais Informações
Criando esquema para validar um xml - parte I, parte II, parte III e parte IV, Tratamento de restrições no 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.