C # - Criando XML a partir de um banco de dados SQL Server


Você precisar acessar e obter informações de um banco de dados, e, após extraí-las as mesmas deverão ser exibidas no formato XML.

Essa tarefa que aparentemente parece complexa é muito simples de ser feita usando os recursos da linguagem C#, LINQ to SQL, LINQ to XML e ADO .NET.

Para ilustrar tal simplicidade vamos criar um exemplo usando o Visual C# 2010 Express edition e usando os recursos do LINQ to SQL, LINQ to XML e ADO .NET vamos acessar, extrair e transforma os dados em um única consulta para em seguida exibi-los no formato XML.

Como exemplo eu vou usar o banco de dados Northwind.mdf do SQL Server (conhece ?) de onde vou realizar as seguintes operações:

Criando o Projeto C#

Abra o Visual C# 2010 Express Edition e crie um novo projeto do tipo Windows Forms Application com o nome XML_DataBase;

No menu Project clique em Add New Item e a seguir selecione o template LINQ to SQL Classes, informe o nome Northwind.dbml e clique em OK;

A partir da janela DataBase Explorer, arraste e solte no descritor LINQ to SQL as tabelas Customer,Orders, Suppliers e para gerar o modelo conceitual e o mapeamento para as classes do domínio da aplicação:

A seguir no formulário form1.cs vamos definir uma interface usando os controles:

Conforme o leiaute da figura a seguir:

Agora vamos definir os namespaces usados no projeto conforme abaixo:

using System;
using System.Data;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Data.SqlClient;
using System.Linq;

A seguir no início do formulário vamos definir as variáveis que iremos usar no projeto:

string ArquivoXML = "C:\\dados\\ArquivoXMLGerado.xml";
NorthwindDataContext db = new NorthwindDataContext();

1- Gerando um arquivo XML via ADO .NET

No evento Click do botão ADO .NET vamos incluir o código que irá acessar o banco de dados Northwind.mdf e gerar o XML:

 private void btnADONET_Click(object sender, EventArgs e)
        {
            string strConnection = "Server=.\\SQLEXPRESs;Database=Northwind;Trusted_Connection=True";
            SqlConnection con = new SqlConnection(strConnection);

            try
            {
                //abre a conexão
                con.Open();
                //define os registros que serão lidos
                SqlDataAdapter da = new SqlDataAdapter("select productid, productname, unitprice from Products", con);

                //definindo o dataset
                DataSet ds = new DataSet();
                da.Fill(ds, "Categorias");
                //preenchendo o dataset

                ds.WriteXml(ArquivoXML);
                //escreve o arquivo XML com nome defnido
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao acessar os dados : " + ex.Message);
            }

        } 

2- Gerando o arquivo XML via LINQ to XML

A LINQ to XML possui uma abordagem poderosa para criar elementos XML que é conhecida como construção funcional que permite a você criar todo ou partes da sua árvore XML em uma única instrução.

Na figura abaixo vemos a hierarquia de classes LINQ to XML:

- Embora XElement esteja abaixo na hierarquia de classes, ele é a classe fundamental no LINQ to XML. (Árvores XML são geralmente composta de uma árvore de XElements.)
- XAttributes
são pares nome/valor associados a um XElement.
- XDocuments são criados somente se for necessário (Ex:tratar um DTD -
Document Type Definition, etc.)
- Todos os outros XNodes só podem ser nós folhas sob um XElement ou possivelmente um XDocument (se existirem no nível da raiz).
- XAttribute e XNode são pares derivados de uma classe base comum XObject e XAttributes não são XNodes porque os atributos XML são pares nome/valor associados a um elemento XML e não nós na árvore XML.

Assim para criar um XElement funcionarios basta definir o seguinte código LINQ to XML:

XElement funcionarios = new XElement("funcionarios",
                                   new XElement("empresa",
                                   new XElement("empresa_nome", "Patrick Tones"),
                                   new XElement("telefone", "55-378-0144"),
                                   new XElement("cargo", “Diretor Executivo”),
                                   new XElement("email", "macoratti@yahoo.com"),
                                   new XElement("empresa_id", "P68042")));

Pela endentação , o construtor XElement se assemelha a uma estruture base XML. A construção funcional é ativada por um um construtor XElement que toma os parâmetros objetos.

Com essa introdução vejamos como é simples gerar um XML...

No evento Click do botão LINQ to XML vamos incluir o código que irá gerar o XML usando LINQ to SQL e LINQ to XML:

  private void btnXML_Click(object sender, EventArgs e)
        {
            XElement xml = new XElement("Contatos",
                                   from c in db.Suppliers
                                   orderby c.SupplierID
                                   select new XElement("Fornecedor",
                                             new XAttribute("FornecedorId", c.SupplierID),
                                             new XElement("Contato", c.ContactName),
                                             new XElement("Empresa", c.CompanyName))
                     );

            xml.Save(ArquivoXML);
        }

3- Filtrando dados em um arquivo XML

No evento Click do botão Filtrar vamos definir o código que irá filtrar dados no arquivo XML gerado:

 private void btnFiltrar_Click(object sender, EventArgs e)
        {

            txtXML.Text = "";

    
       // carrega o arquivo XML
            XDocument resultado = XDocument.Load(ArquivoXML);

       
    // Consulta os dados criando uma subconsulta
            var consulta = from c in resultado.Descendants("Fornecedor")
                                  where (int)c.Attribute("FornecedorId") < 5
                                  select (string)c.Element("Contato") + " " + (string)c.Element("Empresa");

            foreach (string nome in consulta)
            {
                txtXML.Text += "\n\tContato = " + nome;
            }
        }

4- Acessando e exibindo dados de um arquivo XML

No evento Click do botão Ler e Exibir XML defina o código para abrir o arquivo XML usando um StreamReader;

    private void btnLerXML_Click(object sender, EventArgs e)
        {
            if (ArquivoXML == string.Empty)
            {
                MessageBox.Show("Informe o nome do arquivo XML a carregar.", "XML", 
MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                try
                {
                    TextReader reader = new StreamReader(ArquivoXML);
                    XElement root = XElement.Load(reader);
                    //carrega o XML no TextBox
                    txtXML.Text = root.ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Erro : " + ex.Message);
                }
            }
        }

Executando o projeto teremos:

Arquivo XML gerado via ADO .NET
Arquivo XML gerado via LINQ to XML
Dados Filtrados do arquivo XML

Pegue o projeto completo aqui : XML_DataBase.zip

"E Jesus clamou e disse; Quem crê em mim, crê não em mim, mas naquele que me enviou. E que vê a mim, vê aquele que me enviou." João 12:44-45

Referências:


José Carlos Macoratti