Sie sind auf Seite 1von 18

Gerar XMLs pelo SQL Server

Publicado em: 03/12/2009

Vamos ao seguinte cenrio, temos 3 tabelas em nosso banco de dados, so elas: Conta, Usuario, Endereo. Meu cliente tem um sistema interno que recebe todos os dias os novos usurios de seu site, ele quer receber diariamente todos os usurios do site em formato XML. Porm no s os usurios novos, ele quer todos os dias TODOS os usurios ( isso existe). Meu cliente (Bo de venda) tem pr-cadastrados 100.000 usurios, ele pretende ter cerca de 500 novos por dia =O. Se minha calculadora estiver certa 182.500 por ano, pouco at, mas j se precisa pensar sobre o desempenho. O XML deve ter o seguinte formato: <Usuario> <Nome>Teste</Nome> ... * </Usuario> * So os campos: Nome, Sobrenome, Login, E-mail, Sexo, DataCadastro, Tipo, CPF, CNPJ, Razo Social, RG, DataNascimento, Logradouro, Nmero, Complemento, Referencia, Bairro, Cidade, Estado, Pais, Telefone1, Telefone2, Celular, Fax... E assim vai, pois isso s pra exemplificar que campo pra caramba!!! Ento, podemos fazer de 2 modos: O 1 fazer uma view e aps uma procedure que retorna todos esses carinhas para o meu objeto (1 objeto? Sei l acho que vo ser 3 objetos ^^, ou um DataSet talvez, no importa) no C#, l eu varro a lista e vou escrevendo o XML de uma das N maneiras que o C# tem de escrever o XML. Pronto... Ou podemos deixar 60% mais rpido. Podemos at criar a view, porm a procedure que vai retornar para o C# um XML formatado, o C# vai jogar em um arquivo e vai salvar. Joi! Mas como? Para exemplificar vamos trabalhar com Nome, Sobrenome e E-mail. Assim pulamos a parte da View e vamos direto para a procedure CREATE PROCEDURE GerarXMLUsuarios AS BEGIN SELECT [UsuNome] ,[UsuSobrenome] ,[UsuEmail]

FROM [tbUsuarios] END

Agora utilizaremos a clusula FOR XML. O FOR XML simplesmente organiza e retorna as informaes em formato XML. Temos as seguintes opes no FOR XML: 1 FOR XML AUTO: O modo AUTO retorna os resultados da consulta como elementos XML simples e aninhados, ou seja, cada tabela indicada depois da clusula FROM, um elemento do XML , as colunas indicadas no SELECT so atributos. Utilizamos o AS para nomear os elementos:

SELECT [UsuNome] AS Nome ,[UsuSobrenome] AS Sobrenome ,[UsuEmail] AS Email FROM [tbUsuarios] AS UsuariosGerais FOR XML AUTO Resultado:
<UsuariosGerais <UsuariosGerais <UsuariosGerais <UsuariosGerais Nome="Adriano" Sobrenome="Teste" Email="adriano.galesso@teste.com.br" /> Nome="renata" Sobrenome="Teste" Email="renata@teste.com.br" /> Nome="Christiano" Sobrenome="Teste" Email="web@teste.com.br" /> Nome="suporte" Sobrenome="Teste" Email="suporte@teste.com.br" />

Se alguma coluna do SELECT for de uma tabela j identificada, ela colocada como atributo (conforme visto acima), se for de uma tabela diferente ser adicionada como elemento dentro do elemento pai, que a 1 tabela especificada: SELECT UsuariosGerais.[UsuNome] AS Nome ,UsuariosGeraisIntro.[UsuSobrenome] AS Sobrenome ,UsuariosGerais.[UsuEmail] AS Email FROM [tbUsuarios] AS UsuariosGerais INNER JOIN [tbUsuarios] AS UsuariosGeraisIntro ON UsuariosGerais.UsuCodigo = UsuariosGeraisIntro.UsuCodigo FOR XML AUTO Resultado:
<UsuariosGerais Nome="Adriano" Email="adriano.galesso@teste.com.br"> <UsuariosGeraisIntro Sobrenome="Teste" /> </UsuariosGerais> <UsuariosGerais Nome="renata" Email="renata@teste.com.br"> <UsuariosGeraisIntro Sobrenome=" Teste " /> </UsuariosGerais> <UsuariosGerais Nome="Christiano" Email="web@teste.com.br"> <UsuariosGeraisIntro Sobrenome=" Teste " /> </UsuariosGerais> <UsuariosGerais Nome="suporte" Email="suporte@teste.com.br"> <UsuariosGeraisIntro Sobrenome=" Teste " /> </UsuariosGerais>

Vejam que, como estou pegando o Sobrenome de uma tabela diferente, ele criou uma nova Tag dentro da principal e aplicou o atributo Sobrenome a ela. Assim funciona o FOR XML AUTO. 2 FOR XML RAW: No modo RAW cada resultado da instruo SELECT vem em linha de acordo com o nome fornecido ao RAW (que se no for fornecido raw mesmo): SELECT [UsuNome] AS Nome ,[UsuSobrenome] AS Sobrenome ,[UsuEmail] AS Email FROM [tbUsuarios] AS UsuariosGerais FOR XML RAW SELECT [UsuNome] AS Nome ,[UsuSobrenome] AS Sobrenome ,[UsuEmail] AS Email FROM [tbUsuarios] AS UsuariosGerais FOR XML RAW('Teste')

Resultado:
<row <row <row <row Nome="Adriano" Sobrenome="Teste" Email="adriano.galesso@teste.com.br" /> Nome="renata" Sobrenome="Teste" Email="renata@teste.com.br" /> Nome="Christiano" Sobrenome="Teste" Email="web@teste.com.br" /> Nome="suporte" Sobrenome="Teste" Email="suporte@teste.com.br" /> Nome="Adriano" Sobrenome="Teste" Email="adriano.galesso@teste.com.br" /> Nome="renata" Sobrenome="Teste" Email="renata@teste.com.br" /> Nome="Christiano" Sobrenome="Teste" Email="web@teste.com.br" /> Nome="suporte" Sobrenome="Teste" Email="suporte@teste.com.br" />

<Teste <Teste <Teste <Teste

Nota-se que diferente do AUTO, podemos nomear nossas elementos de acordo com o que colocamos no RAW e tabelas diferentes no so criadas como novos elementos filhos. Assim funciona o FOR XML RAW 3 FOR XML PATH: O modo PATH tem uma maneira simples de misturar ns de elementos e atributos, e para propriedades mais complexas o PATH pode ser utilizado para trazer resultados com mais facilidade. Os nomes ou alias de colunas so tratados como expresses XPath. Vamos ao teste com nome de colunas: SELECT [UsuNome] AS '@Nome' ,[UsuSobrenome] AS Sobrenome ,[UsuEmail] AS Email FROM [TIKCUsuarios] AS Usuarios

FOR XML PATH Resultado:


<row Nome="Adriano"> <Sobrenome>Teste</Sobrenome> <Email>adriano.galesso@teste.com.br</Email> </row> <row Nome="renata"> <Sobrenome>barbosa</Sobrenome> <Email>renata@teste.com.br</Email> </row> <row Nome="Christiano"> <Sobrenome>Teste</Sobrenome> <Email>web@teste.com.br</Email> </row> <row Nome="suporte"> <Sobrenome>Teste</Sobrenome> <Email>suporte@teste.com.br</Email> </row>

Nota-se que onde colocamos o @ temos um Atributo, os que esto sem o @ so Elementos. Outro teste, pra mim o mais legal, o seguinte: SELECT [UsuCodigo] AS '@ID' ,[UsuNome] AS 'Nome/Nome' ,[UsuSobrenome] AS 'Nome/Sobrenome' ,[UsuEmail] AS 'Email' FROM [TIKCUsuarios] AS Usuarios FOR XML PATH('Usuarios')

Resultado:
<Usuarios ID="216562"> <Nome> <Nome>Adriano</Nome> <Sobrenome>Teste</Sobrenome> </Nome> <Email>adriano.galesso@teste.com.br</Email> </Usuarios> <Usuarios ID="216562"> <Nome> <Nome>renata</Nome> <Sobrenome>Teste</Sobrenome> </Nome> <Email>renata@teste.com.br</Email> </Usuarios> <Usuarios ID="216563"> <Nome> <Nome>Christiano</Nome> <Sobrenome>Teste</Sobrenome> </Nome> <Email>web@teste.com.br</Email> </Usuarios> <Usuarios ID="216566">

<Nome> <Nome>suporte</Nome> <Sobrenome>Teste</Sobrenome> </Nome> <Email>suporte@teste.com.br</Email> </Usuarios>

Nota-se que quando colocado / entre os nomes dos elementos, o elemento anterior a / o pai e o posterior o elemento filho. Outro ponto o @, ele s pode ser usado se for o 1 elemento, ou se o elemento anterior for @ tambm. No caso se colocssemos o @ no Email daria um erro. Por fim, o PATH pode ser nomeado assim como o RAW. Assim funciona o FOR XML PATH. 4 FOR XML EXPLICIT: O mais avanado das 4 opes, o EXPLICIT especifica a forma que ter a arvore XML, assim voc consegue manipular e ter mais controle em qualquer n que ser criado, no nosso caso por exemplo, o Sobrenome pode ser um n filho de Nome sem precisarmos manipular tabelas conforme feito em exemplos anteriores. Porm o EXPLICIT tem algumas obrigaes: A primeira coluna deve fornecer o nmero da marca, o tipo de inteiro, do elemento atual, e o nome da coluna deve ser TAG. A segunda coluna deve fornecer um nmero de marca do elemento pai e esse nome de coluna deve ser PARENT. Assim criando uma hierarquia.

Tambm precisamos especificar os nomes das colunas em um formato geral: Nome do Elemento ! Numero da TAG ! Nome do Atributo ! Diretiva Onde: Nome do Elemento: Identificador da Tag, exemplo Usuario = <Usuario> Numero da TAG: Assim como Tag e o Parent, ajuda a determinar a aninhamento do XML. Nome do Atributo: Fornece o nome do atributo a ser construdo no Nome do Elemento especificado, se existir a diretiva, ai esse se torna um elemento filho. Diretiva: opcional e voc pode us-la para fornecer informaes adicionais para construo do XML. Com o propsito de codificar valores e mapear os dados de cadeia de caracteres para XML. No vou me aprofundar muito no EXPLICIT, pois o mesmo tem muitas informaes. Uma boa leitura est aqui para quem quiser ou precisar se aprofundar no assunto. Entretanto vamos ver alguns exemplos: SELECT 1 AS TAG ,NULL AS PARENT ,[UsuNome] as [Usuario!1!Nome!Element] ,[UsuSobrenome] as [Usuario!1!Sobrenome!Element]

,[UsuEmail] as [Usuario!1!Email!Element] FROM [tbUsuarios] FOR XML EXPLICIT Resultado:


<Usuario> <Nome>Adriano</Nome> <Sobrenome>Teste</Sobrenome> <Email>adriano.galesso@teste.com.br</Email> </ Usuario > < Usuario > <Nome>renata</Nome> <Sobrenome>Teste</Sobrenome> <Email>renata@teste.com.br</Email> </ Usuario > < Usuario > <Nome>Christiano</Nome> <Sobrenome>Teste</Sobrenome> <Email>web@teste.com.br</Email> </ Usuario > < Usuario > <Nome>suporte</Nome> <Sobrenome>Teste</Sobrenome> <Email>suporte@teste.com.br</Email> </Usuario >

Nota-se que obriguei todas as TAG serem 1 e todas as PARENT serem NULL, e Order o nome do Elemento, 1 o nmero da Tag (que s temos 1 mesmo), depois temos os nomes dos atributos e por fim digo que esses atributos so Elementos ( se no tivesse especificado isso, eles viriam em linha como se fosse o RAW). Assim at que fcil, mas e se quisermos fazer o que eu disse acima? Colocar o Sobrenome como elemento filho de Nome? Temos uma tabela (retirada do site do MSDN) ela mostra como trabalha o TAG e o PARENT.

Vendo assim parece simples, mas ficar manipulando essas duas colunas bem complicado.

Ento podemos usar o Campo chave para organizar meu XML: SELECT 1 AS TAG ,NULL AS PARENT ,[UsuCodigo] * 100 AS [Usuario!1!UsuCodigo] ,NULL as [Nome!2!Nome!Element] ,NULL as [Nome!2!Sobrenome!Element] ,[UsuEmail] as [Usuario!1!Email!Element] FROM [TIKCUsuarios] UNION SELECT 2 AS TAG ,1 AS PARENT ,[UsuCodigo] * 100 + 1 ,[UsuNome] ,[UsuSobrenome] ,[UsuEmail] FROM [TIKCUsuarios] ORDER BY [Usuario!1!UsuCodigo] FOR XML EXPLICIT Resultado:
<Usuario UsuCodigo="21656000"> <Email>renata @teste.com.br</Email> <Nome> <Nome>renata</Nome> <Sobrenome>Teste</Sobrenome> </Nome> </Usuario> <Usuario UsuCodigo="21656200"> <Email>renata@teste.com.br</Email> <Nome> <Nome>renata</Nome> <Sobrenome>Teste</Sobrenome> </Nome> </Usuario> <Usuario UsuCodigo="21656300"> <Email>web@teste.com.br</Email> <Nome> <Nome>Christiano</Nome> <Sobrenome>Teste</Sobrenome> </Nome> </Usuario>

Agora nota-se muita coisa =) Bom vemos que apareceu o UsuCodigo, ele vai ajudar a ordenao dos resultados, e mostro o porqu: Sem ele os resultados viriam ordenados do 1 SELECT e depois os do 2 SELECT:

Com ele temos como organizar

Por isso fazemos a utilizao da coluna chave e nela fazemos uma determinada conta para os nmeros prximos no se repetirem. O outro SELECT est para trazer os resultados da TAG 2 e PARENT 1, porque queremos que o Nome seja um n filho dentro do n principal. Se precisssemos de outro n, novamente teramos que usar o SELECT. No termino o FOR XML EXPLICIT dizendo que assim que funciona pois tem N maneiras e N atribuies que podemos fornecer ao mesmo. Mas garanto uma boa leitura no site da MSDN. 5 OUTROS ARGUMENTOS DO FOR XML (AUTO, RAW e PATH apenas) Podemos aplicar a diretiva ELEMENTS aps o FOR XML, assim o XML ser todo ajustado a base de elementos (os valores no sero mais atributos): SELECT UsuariosGerais.[UsuNome] AS Nome ,UsuariosGeraisIntro.[UsuSobrenome] AS Sobrenome ,UsuariosGerais.[UsuEmail] AS Email FROM [TIKCUsuarios] AS UsuariosGerais INNER JOIN [TIKCUsuarios] AS UsuariosGeraisIntro ON UsuariosGerais.UsuCodigo = UsuariosGeraisIntro.UsuCodigo FOR XML AUTO, ELEMENTS Resultado:
<UsuariosGerais> <Nome>Adriano</Nome>

<Email>adriano.galesso@teste.com.br</Email> <UsuariosGeraisIntro> <Sobrenome>Teste</Sobrenome> </UsuariosGeraisIntro> </UsuariosGerais> <UsuariosGerais> <Nome>renata</Nome> <Email>renata@teste.com.br</Email> <UsuariosGeraisIntro> <Sobrenome>barbosa</Sobrenome> </UsuariosGeraisIntro> </UsuariosGerais> <UsuariosGerais> <Nome>Christiano</Nome> <Email>web@teste.com.br</Email> <UsuariosGeraisIntro> <Sobrenome>Teste</Sobrenome> </UsuariosGeraisIntro> </UsuariosGerais> <UsuariosGerais> <Nome>suporte</Nome> <Email>suporte@teste.com.br</Email> <UsuariosGeraisIntro> <Sobrenome>Teste</Sobrenome> </UsuariosGeraisIntro> </UsuariosGerais>

Nota-se que est tudo como Tag e seus valores no esto mais como atributos, tambm nota-se o novo n que se criou com a tabela diferente. Outra diretiva que podemos aplicar o ROOT. Com ela atribumos um elemento pai ao elemento geral: SELECT [UsuCodigo] AS '@ID' ,[UsuNome] AS 'Nome/Nome' ,[UsuSobrenome] AS 'Nome/Sobrenome' ,[UsuEmail] AS 'Email' FROM [TIKCUsuarios] AS Usuarios FOR XML PATH('Usuarios'), ROOT('Teste') Resultado:
<Usuarios ID="216562"> <Nome> <Nome>renata</Nome> <Sobrenome>Teste</Sobrenome> </Nome> <Email>renata@teste.com.br</Email> </Usuarios> <Usuarios ID="216562"> <Nome> <Nome>renata</Nome> <Sobrenome>Teste</Sobrenome> </Nome> <Email>renata@teste.com.br</Email> </Usuarios> <Usuarios ID="216563"> <Nome> <Nome>Christiano</Nome> <Sobrenome>Teste</Sobrenome> </Nome> <Email>web@teste.com.br</Email> </Usuarios> <Usuarios ID="216566"> <Nome> <Nome>suporte</Nome> <Sobrenome>Teste</Sobrenome>

</Nome> <Email>suporte@teste.com.br</Email> </Usuarios>

Temos outras diretivas como o TYPE, ELEMENTXSINIL, BINARY BASE64, XMLSCHEMA... Mas essas so mais avanadas, fogem do nosso artigo principal. Bom, agora sabemos como gerar XMLs pelo SQL e format-los da maneira que precisamos. Mas para onde vai esse resultado? Voc pode gravar em uma coluna de uma tabela qualquer do tipo XML no SQL, ou pode mandar pro C# fazer alguma coisa. E isso que vamos fazer, j que este o cenrio. Vamos imaginar o projeto criado, e l na nossa classe de dados temos os NAMESPACES: using System.Xml; using System.Xml.XPath; using System.Data.SqlClient; Vamos ter os atributos: #region " Atributos " private private private private SqlConnection oConn; SqlCommand oCmd; XmlReader xmlReader; XPathDocument xpathDoc;

#endregion

Um construtor: #region " Construtor " public MinhaClasse() { oConn = new SqlConnection(ConfigurationManager.AppSettings["MinhaConn"]); oConn.Open(); oCmd = oConn.CreateCommand(); } #endregion E por fim, o meu mtodo que retorna um XPathDocument: #region " Mtodos " protected internal XPathDocument SalvarXML()

oCmd.CommandType = CommandType.StoredProcedure; oCmd.CommandText = "GerarXMLUsuarios; try { xmlReader = oCmd.ExecuteXmlReader(); xpathDoc = new XPathDocument(xmlReader, XmlSpace.Preserve); } catch (Exception ex) { throw new Exception(ex.ToString()); } finally { oConn.Close(); } return xpathDoc; } #endregion Nada de novo at esse mtodo. Chamamos a procedure e damos um ExecuteXMLReader. O XmlReader fornece uma acesso somente leitura e somente para frente de um fluxo de dados Xml. O XPathDocument fornece representao em memria de um documento, tambm somente leitura e somente para frente de um Xml. Sabendo isso, temos um acesso ao XML gerado pela base, e uma representao em memria deste XML, preservando espaos. Agora na nossa classe de negcios: Temos os NAMESPACES: using System.Xml.XPath; using System.Xml;

Temos atributos: private string diretorio = ConfigurationManager.AppSettings["Diretorio"]; private string URL = ConfigurationManager.AppSettings["URL"]; E temos um mtodo que gera e salva um XML: public string GerarXML() {

string arquivo = "teste.xml"; string dirArq = diretorio + arquivo; TesteDAO oTesteDao = new TesteDAO (); XPathDocument oXPdoc = oTesteDao.ListarXML(tipoXML); XPathNavigator oXPNav = oXPdoc.CreateNavigator(); XmlTextWriter Xwriter = new XmlTextWriter(dirArq, System.Text.Encoding.UTF8); Xwriter.Formatting = Formatting.Indented; Xwriter.Indentation = 3; Xwriter.WriteStartDocument(); Xwriter.WriteNode(oXPNav, true); Xwriter.WriteEndDocument(); Xwriter.Close(); return URL + arquivo; } Nada de novo at esse mtodo. Criamos um XPathDocument, que recebe retorno do meu mtodo na classe de acesso a dados vista acima. Criamos um XPathNavigator que uma classe abstrata, onde temos um modelo de cursor para navegar (como o prprio nome diz) em nosso XML. Como no temos nada para editar no XML ento vamos salvar o mesmo com o XmlTextWriter, onde passamos o caminho que queremos salvar e a codificao (no construtor). Depois podemos fornecer o tipo da formatao, indentao, comeo e documento XML, ns (que nesse caso o nosso XML inteiro), o fim do documento XML e fechamos o arquivo. Vamos ser bonzinhos e vamos retornar o caminho do XML em formato Web. Agora sim, Pronto! Fiz este artigo baseado em um problema real, o problema era bem parecido com o colocado aqui, mas no era 1 XML e sim 4, claro, no tem tantos usurios quanto o que eu falei, mas um calculo baseado em possibilidades. Esses 4 XMLs, atualmente com 25 MB somados, so gerados diariamente. A 1 tentativa foi usando um framework e escrevendo os XML pelo C#, o servidor travava graas aos inmeros acessos ao banco que o componente (framework) fazia. A 2 tentativa foi criar procedures especificas que j traziam o resultado perfeito e no C# jogadas em objetos especficos tambm, os objetos eram listados e assim os XMLs eram escritos, no tinha stress, mas ainda demorava cerca de 30 minutos para gerar por completo. A 3 tentativa esta da forma que eu falei neste artigo, uso o FOR XML PATH, trago pro C# e escrevo o arquivo. Por isso este artigo foi escrito. Gero 25 MB de arquivos XML em 28 SEGUNDOS...! \o/

At a prxima.

O uso do XML na integrao de Banco de Dados Relacionais


Publicado em: 23/11/2007

Obs: Este artigo faz parte do projeto de concluso de curso de Sistemas de Informao do autor. Eduardo Feltrin Marques Agla Pereira Zaupa Universidade do Oeste Paulista (UNOESTE)FIPP (Faculdade de Informtica de Presidente Prudente) feltrin@fipp.unoeste.br aglae@unoeste.br

RESUMO. A necessidade da troca de dados advindos de diferentes fontes vem crescendo relativamente, justamente pelo grande trfego de informao que gerado tanto em sistemas convencionais como web. Tais dados, usualmente gerados por pessoas, so escritos de vrias maneiras, sendo que, em alguns casos, um mesmo objeto do mundo real pode ser representado de vrias formas. O objetivo da integrao de dados permitir o acesso integrado a vrias fontes de informao heterogneas e independentes, atravs de uma viso global.
Com a especificao do padro XML, o mesmo passou a ser utilizado para intercmbio de dados, uma vez que capaz de agregar a seu contedo informaes que o descrevem(metadados), possibilitando assim a representao de dados que no poderiam ser representadas atravs do modelo relacional utilizado pela maioria dos SGBDs. Com o padro XML possvel ento a criao de vises materializadas dos dados armazenados em um SGBD local e utilizar esta viso para os mais variados fins, por isso o XML (eXtensible Markup Language) vem se caracterizando como um padro de troca e integrao de dados, de forma que, os sistemas de integrao de dados a tm utilizado como modelo comum.

Este artigo visa mostrar como se pode utilizar o padro XML na integrao de Dados de Bancos Relacionais
1INTRODUO

A XML (eXtensible Markup Language, ou Linguagem Extensvel de Marcao) foi criada em 1996, por especialistas do World Wide Web Consortium (W3C), rgo de regulamentao dos padres utilizados na internet. Ela fornece um formato estruturado para descrio de dados e foi criada como um subconjunto simplificado do padro SGML (Standard Generalized Markup Language, ou Linguagem Padro de Marcao Generalizada). Caractersticas de flexibilidade e portabilidade vm fazendo com que, nos ltimos anos, a XML seja aceita como um padro para representao, intercmbio e manipulao de dados em aplicaes para as mais diversas reas de negcios. Representao de dados em

aplicaes de gerenciamento de contedo, aplicaes de transaes bancrias e de publicao de contedo em intranets so alguns exemplos de uso da XML. O crescimento na utilizao da XML levou a um aumento significativo no volume de dados nesse formato que so armazenados, transportados e recuperados por aplicaes no mundo todo. Um exemplo que ilustra essa nova demanda a troca de dados entre dois sistemas de bancos de dados diferentes, usando documentos XML para o intercmbio dos dados. Essa nova realidade faz surgir novos questionamentos a respeito de onde e como armazenar esses dados, e qual a melhor maneira de integrar as tecnologias j existentes de sistemas de bancos de dados (principalmente no modelo relacional) com a XML. Tambm surgiram novas tecnologias para armazenamento de XML a serem consideradas, como os bancos de dados nativos de XML. Esse trabalho de pesquisa apresenta um panorama das formas mais adotadas atualmente para a integrao de dados de diversas bases relacionais em um mesmo local no formato XML. O captulo 2 traz um breve histrico da XML, a definio do que a XML, e expe alguns conceitos bsicos sobre ela. O captulo 3 mostra algumas tcnicas de integrao de dados de diversas bases relacionais em um documento XML.
2XML

O XML uma linguagem derivada da SGML e foi idealizada por Jon Bosak, engenheiro da Sun Microsystems. O autor era conhecedor e usurio de SGML e apresentou ao W3Consortium, sua idia de explorar o SGML em aplicaes voltadas para internet. Em 1996 foi criado o XML, inicialmente como uma verso simplificada da SGML e em fevereiro de 1998, o XML tornou-se uma especificao formal, reconhecida pela W3C. Segundo a W3 Consortium, dados semi-estruturados so dados dispostos em representaes rgidas, sujeitas a regras e a restries impostas pelo esquema que os criou. Programas que produzem tais dados os armazenam em disco, para que possam ser utilizados em formato binrio ou texto. Os dados semi-estruturados representam hoje um componente importante de ambientes heterogneos como a internet e o padro XML, por permitir a criao de uma marcao flexvel, aceita bem variaes na estrutura caractersticas desse tipo de dado. Tabela 1 Exemplo de um texto livre e o seu correspondente XML

2.1 - Documentos XML Um documento XML um texto (em formato Unicode) com tags de marcao (markup tags) e outras informaes. Os documentos XML so sensveis letras maisculas e minsculas. Um documento XML bem formatado quando segue algumas regras bsicas. Tais regras so mais simples do que para documentos HTML e permitem que os dados sejam lidos e expostos sem nenhuma descrio externa ou conhecimento do sentido dos dados XML. Documentos bem estruturados: tem casamentos das tags de incio e fim as tags de elemento tem que ser apropriadamente posicionadas

Existem 6 tipos de itens de marcao que podem ocorrer no XML: Elementos Referncias a entidades Comentrios Instrues de processamento Sees marcadas Tipos de documentos

Elementos : So a mais comum forma de marcao. Delimitados pelos sinais de menor e maior, a maioria dos elementos identificam a natureza do contedo que envolvem, alguns elementos podem ser vazios, neste caso eles no tm contedo. Referncias a Entidades: A fim de introduzir a marcao em um documento, alguns documentos foram reservados para identificar o incio da marcao. O sinal de menor, <

por exemplo, identifica o incio de uma marca de inicio ou trmino. Em XML, entidades so usadas para representar estes caracteres especiais. As entidades tambm so usadas para referenciar um texto freqentemente repetido ou alterado e inclu-lo no contedo de arquivos externos. Cada entidade deve ter um nome nico. Comentrios: Comentrios iniciam com <!-- e terminam com -->. Os comentrios podem conter qualquer dado, exceto a literal "--". Voc pode colocar comentrios entre marcas em qualquer lugar em seu documento. Comentrios no fazem parte de um contedo textual de um documento XML. Um processador XML no preciso para reconhec-los na aplicao. Instrues de Processamento: Instrues de processamento (PIs) so formas de fornecer informaes a uma aplicao. Assim como os comentrios, elas no so textualmente parte de um documento XML, mas o processador XML necessrio para reconhec-las na aplicao. Sees Marcadas: Em um documento, uma seo CDATA instrui o analisador para ignorar a maioria dos caracteres de marcao. Considere um cdigo-fonte em um documento XML. Ele pode conter caracteres que o analisador XML iria normalmente reconhecer como marcao (< e &, por exemplo). Para prevenir isto, uma seo CDATA pode ser usada.
2.1.1 - Documentos Bem-formados So documentos que atendem sintaxe XML usada dentro do documento. Por exemplo, em casos de no incluir marcas de fechamento ao inserir elementos no documento, esquecer de incluir a declarao de documento XML no incio do documento, se incluir caracteres que no possam ser analisados sintaticamente ou sejam invlidos, voc no possuir um documento XML bem-formado. Documentos bem-formados so na realidade, mais do que simples documentos que seguem a sintaxe XML. Alm disso, os considerados bem-formados devem atender s seguintes condies: Nenhum atributo pode aparecer mais do que uma vez em uma nica marca de incio; No pode incluir referncias a entidades externas em um atributo de string; Deve-se declarar todas as entidades exceto aquelas includas como parte da linguagem XML; No pode se referir a uma entidade binria no corpo do contedo; No pode criar entidades de texto ou de parmetros recursivas seja direta, seja indiretamente; As entidades paramtricas devem ser declaradas antes para que se possam us-las em um documento; Quaisquer marcas no - vazias devem ser aninhadas adequadamente; O nome na marca de fim de um elemento deve coincidir com o tipo de elemento da marca de incio; No podemos incluir um (<) no texto substitutivo de qualquer entidade;

2.1.2 - Documentos Vlidos Um documento bem-formado no vlido a menos que ele contenha uma DTD apropriada. O documento tambm precisa obedecer as restries dessa declarao. Cada documento XML vlido deve iniciar com um cabealho que deve conter as seguintes informaes:

Uma descrio das regras estruturais que o documento deve seguir; Uma lista de recursos externos ou entidades externas que criem qualquer para especfica do documento; Quaisquer declaraes dos recursos internos ou entidades internas; Quaisquer notaes ou recursos no-XML que devem ser enumerados no documento; Listas de qualquer recurso no-XML que possam ser encontradas no documento.

2.2 Linguagens de definio de esquemas Algumas abordagens para definio de estruturas para documentos XML bastantes conhecidas so DTD (Document Type Definition) e XML Schema. 2.2.1 DTD

Comumente, atribui-se uma DTD a responsabilidade do uso de uma linguagem oficial para delimitar a estrutura e os possveis valores nos documentos XML. Basicamente uma DTD define um vocabulrio comum que documentos xml referenciados devem obedecer. As regras a serem especificadas em uma DTD devem iniciar sempre com os smbolos <! (menor e exclamao) seguido de um marcador bsico obrigatoriamente escrito com letra maiscula e terminado com um sinal de maior. Uma DTD pode ser definida como um mecanismo de descrio de objetos (elementos, atributos, etc.) que podem aparecer no documento, normalmente iniciado com elementos. A declarao de um elemento iniciada com a marcao bsica ELEMENT, j um atributo ser com a marcao ATTLIST. Aps o marcador bsico deve aparecer o nome do elemento ou atributo seguido por uma palavrachave especial que define qual o tipo de dado do elemento/atributo ou por um modelo de contedo (tipos e filhos do elemento). Toda declarao de elemento termina com um sinal de maior.
Uma DTD tambm permite a delimitao da ordem em que os elementos devero ser apresentados no documento XML. So dois os delimitadores disponibilizados pela sintaxe da DTD. O primeiro , que se comporta como o operador and das linguagens de programao, onde os elementos devem aparecer no documento XML na mesma ordem que so declarados na DTD. O segundo delimitador |, se assemelham ao operador or das linguagens de programao, e que significa o elemento/atributo composto e que ou um ou outro elemento podem formar o contedo deste elemento/atributo composto. 2.2.2 XML Schema Um esquema XSD (XML Schema Definition) define estruturas XML declarando elementos, sua ordem, restries de contedo, atributos, grupos reusveis, novos tipos de dados, enfim declarando tudo que for necessrio para estabelecer o que uma instncia de um documento XML, em conformidade com este esquema pode, ou deve ter [Mau05]. XML Schema foi criado pela Microsoft, mas atualmente uma recomendao da W3C e provavelmente ir substituir a DTD porque so mais fceis de aprender, so extensveis a futuras adies, suportam tipos de dados, so escritos em XML e suportam os namespaces [Mat02]. Existem dois tipos bsicos de elementos em XML Schema: elementos simples (simpleType) e

elementos complexos (complexType), a diferena entre eles que os tipos complexos permitem elementos em seu contedo e podem carregar atributos[Mat02]. Simples um tipo bsico que pode armazenar uma unidade de informao de um determinado tipo que pode ser: string, float, date, double, timeDurations, etc. Complexo um tipo que define a estrutura de um elemento, caractersticas dos sub-elementos, atributos, cardinalidade dos sub-elementos e obrigatoriedade dos atributos.

Das könnte Ihnen auch gefallen