Como extrair dados em XML para atender os requisitos de um Schema

Como extrair dados em XML para atender os requisitos de um Schema


Introdução

Este artigo tem sua origem em uma pergunta postada no Fórum TechNet Brasil do SQL Server - XML - Modo EXPLICIT, CDATA e irá fornecer à você um problema comum sobre à formatação de uma consulta de dados em T-SQL para um XML que atenda adequadamente às condições de um Schema XML (XSD) ou um Documento de Definição de Tipos de Dados (DTD).

Esta é uma das possíveis soluções relacionadas para este problema, se você conhece outras opções em T-SQL que atendam à necessidade do problema proposto, fique à vontade para acrescentar seu conteúdo neste artigo.


Problema

Durante minha leitura nos Threads do Fórum de SQL, encontrei à seguinte pergunta que estava em discussão até então.

A pergunta era: "Estou tentando gerar um XML utilizando o modo EXPLICIT, porque eu preciso utilizar CDATA em alguns campos. O problema é que o XML exige que alguns AttributeName sejam "g:AttributeName". E com WITH XMLNAMESPACES não é compatível com modo EXPLICIT."

É preciso estar claro que o inquiridor da pergunta, mesmo com dificuldade, explica que seu XML precisa obter os dados no seguinte formato:
  • Todo conteúdo da estrutura deve pertencer ao namespace "g"
  • Cada registro no XML deve estar sob à tag "item"
  • A tag raiz deve permanecer como "xml"
O XML esperado pelo inquiridor da pergunta deve resultar algo semelhante à este conteúdo:

<?xml version="1.0" encoding="utf-8"?>
<xml>
  <item>
    <g:id>1</g:id>
    <g:Nome>teste 1</g:Nome>
  </item>
  <item>
    <g:id>2</g:id>
    <g:Nome>teste 2</g:Nome>
  </item>
</xml>


Causas

Normalmente, a utilização de Schema XML ou DTD tem como objetivo verificar e validar a troca e/ou recepção de informações entre duas empresas ou departamentos que utilizam Plataformas de sistemas diferentes. Todos estes critérios de validação possibilitam manter os dados íntegros entre o sistema Fornecedor dos dados e o sistema Receptor.

Isto também ocorre em Plataformas de ambientes semelhantes, mas numa quantidade bem menor. Esta necessidade de integração de dados é muito antiga entre empresas e até mesmo entre Departamentos/Filiais que necessitam manter seus compartilhados sempre dados atualizados. Hoje o SQL Server 2012, possui recursos para processar estes tipos de tratamento de dados que iremos apresentar, mas estas mesmas funcionalidades podem ser obtidas com maior amplitude através do BizTalk Server.

Etapas de Diagnóstico

Depois de diagnosticarmos à causa do problema, vamos para à sua resolução adequada. Podem existir outras soluções como alternativa, mas esta indicada no final do artigo compreende exatamente à pergunta proposta no Fórum, da forma mais simples e prática possível.

Construíndo o Cenário do Problema

Para que possamos simular com precisão o problema e propor à sua solução, vamos construir uma tabela com poucos dados, porém semelhantes à situação indicada no Threads do Fórum (Figura 1):

CREATE TABLE dbo.teste (
Id INT IDENTITY,
CD_Produto INT,
NM_Produto VARCHAR(50)
)
GO

INSERT INTO dbo.teste ( CD_Produto , NM_Produto )
VALUES ( 1,'teste 1'),(2,'teste 2')
GO



Figura 1 - Criando a tabela para demonstração da solução


Solução

Para estruturar à solução do problema, é preciso estar claro sobre todas às condições do Schema XML do inquiridor da pergunta, mesmo que este não tenha sido apresentado.

Apesar do inquiridor estar tentando obter o formato XML desejado através de uma consulta T-SQL no modo EXPLICIT, este modo não permite à condição do Schema XML com o predecessor do namespace "g", desta forma estaremos apresentando à solução com T-SQL utilizando o modo de consulta RAW.

Então para definir à precedência do namespace "g", inicializamos a URI e definimos os campos da tabela com o este predecessor utilizando o separador, como segue o padrão do Schema XML informado. 

Como cada linha deve possuir uma tag chamada "item" definimos no RAW que o novo nome para a tag "row" deve ser "item".

Para finalizar todos os requisitos estipulados pelo inquiridor, definimos no ROOT que à tag raiz para todo o este XML tenha o nome "xml" definido.


WITH XMLNAMESPACES ('uri' as g)

  SELECT

    CD_Produto as 'g:ID', 
    NM_Produto as 'g:NOME'
  FROM dbo.teste 

FOR XML RAW('item'), ROOT('xml'), ELEMENTS XSINIL

 


O resultado é exibido como esperado pelo inquiridor da pergunta (Figura 2):

 


Figura 2 - XML estruturado como definido no Schema

Informações Adicionais

Se você deseja saber como consumir e validar o conteúdo de um XML através de XSD ou DTD, utilizando às linguagem de programação VB.Net ou C#, recomendo à leitura das Bases de Conhecimento: 315533 e 318504.

Créditos

Este artigo foi escrito inspirado nos artigos: Obrigado SandroNaomiPeter pela constante orientação em seus artigos. Isso me motivou à criar este artigo !

Para fortalecer o seu conhecimento sobre XMLXSD e DTD, recomendo à leitura dos conteúdos:

Referências

Leia alguns documentos relacionados ao assunto:

Veja Também

Leia alguns artigos relacionados ao assunto:
Outro lugar importante encontrar uma enorme quantidade de artigos relacionados à XML e T-SQL é o próprio TechNet Wiki. Utilize mais às tags para localização de conteúdo dos artigos. 

Biblioteca TechNet

Leia alguns tópicos relacionados ao assunto:

Outros Idiomas

Este artigo também pode ser encontrado nos idiomas:



Este artigo foi premiado com a Medalha de Prata no TechNet Guru de Dezembro/2013 
Classificar por: Data da Publicação | Mais Recente | Mais Úteis
Comentários
  • Durval Ramos edited Revision 8. Comment: Ajuste do conteúdo

Página 1 de 1 (1 itens)