Revisão Atual postado em artigos TechNet por Durval Ramos em 17/1/2014 10:36:16
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.
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:
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.
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.
NM_Produtoas'g:NOME'
FROMdbo.teste
Para fortalecer o seu conhecimento sobre XML, XSD e DTD, recomendo à leitura dos conteúdos:
Este artigo foi premiado com a Medalha de Prata no TechNet Guru de Dezembro/2013
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 umDocumento 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"
<?xmlversion="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 deinformaçõ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):CREATETABLEdbo.teste(
IdINTIDENTITY,
CD_ProdutoINT,
NM_ProdutoVARCHAR(50)
)
GO
INSERTINTOdbo.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.
WITHXMLNAMESPACES('uri'asg)
SELECT
CD_Produtoas'g:ID',NM_Produtoas'g:NOME'
FROMdbo.teste
FORXMLRAW('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:- Modelo para Converter um Thread do Fórum dentro de um Novo Artigo Wiki
- Edição Técnica
- Boas Práticas para Referências e Citações
Para fortalecer o seu conhecimento sobre XML, XSD e DTD, recomendo à leitura dos conteúdos:
- XML and XML Schemas in BizTalk Server Concepts
- Exemplos de Schema XML
- Extraindo informações de arquivo XML para o SQL Server
Referências
Leia alguns documentos relacionados ao assunto:Veja Também
Leia alguns tópicos relacionados ao assunto:- O que é Schema XML ?
- Endendendo sobre Schema XML
- Coleção de Schemas XML (SQL Server)
- Como criar um Schema XML de um Documento XML
- Sintaxe do Schema XML
- Criando Schemas XML à partir de um arquivo XML
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
Tags: Artigo