C# - Operações básicas com XML (revisão)


Neste artigo eu vou rever algumas operações básicas com arquivos XML usando a linguagem C#. Iremos mostrar como exibir um arquivo xml no controle ListView e como gerar um arquivo XML exibindo-o em um ListBox.

Em todos os exemplos eu estou usando o Visual Studio 2012 for Windows desktop.

Abra o Visual Studio 2012 for Windows desktop e clique em New Project;

Clique em Visual Studio Solutions e selecione Blank Solution informando o nome XML_CSharp e clicando no botão OK;

Dessa forma teremos uma solução a partir da qual iremos incluir os projetos deste artigo.

Os conceitos básicos sobre XML podem ser vistos nas referências do artigo.

1- Vinculando uma fonte de dados XML ao controle ListView

No menu File clique Add -> New Project e a seguir escolha Visua C# -> Windows e o template Windows Forms Application informando o nome XML_ListView e clique em OK;

Isso irá criar um novo projeto à nossa solução.

Vamos criar um arquivo XML para usar como exemplo no projeto.

No menu PROJECT clique em Add New Item e selecione Visual C# Items -> XML File e informe o nome Funcionarios.xml clique em Add;

 

A seguir defina a estrutura do arquivo Funcionarios.xml conforme mostra a figura abaixo:

No formulário form1.cs do projeto inclua os seguintes controles:

Defina os controles conforme o leiaute abaixo:

No evento Load do formulário inclua o código abaixo que define um cabeçalho para o controle ListView:

 private void Form1_Load(object sender, EventArgs e)
 {
            lvFunci.View = View.Details;
            lvFunci.GridLines = true;
            lvFunci.FullRowSelect = true;
            lvFunci.Columns.Add("Codigo", 100);
            lvFunci.Columns.Add("Nome", 100);
            lvFunci.Columns.Add("Cargo", 100);
            lvFunci.Columns.Add("Setor", 100);
            lvFunci.Columns.Add("Salário", 50);
            lvFunci.Columns.Add("Commissão", 50);  
 }

No evento Click do botão Carregar XML inclua o código abaixo:

  private void btnCarregarXML_Click(object sender, EventArgs e)
        {
            try
            {
                DataSet ds = new DataSet();
                ds.ReadXml(@"c:\dados\Funcionarios.xml");

                ListViewItem item;

                foreach (DataRow dr in ds.Tables["funci"].Rows)
                {
                    item = new ListViewItem(new string[] { dr["Codigo"].ToString(), dr["Nome"].ToString(), dr["Cargo"].ToString(),
                                                                              dr["Setor"].ToString(), dr["Salario"].ToString(), dr["Comissao"].ToString()});
                    lvFunci.Items.Add(item);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message.ToString(), "Erro", MessageBoxButtons.OK);
            }
        }

O código acima usa o método ReadXML que lê o esquema e os dados do XML em um dataset.

Cada Nó <funci> será tratado como um item do ListView equivalendo a uma linha de uma tabela; por isso percorremos as linhas do datatable: ds.Tables["funci"].Rows

No botão Fechar inclua o código abaixo:

 private void btnFechar_Click(object sender, EventArgs e)
 {
            this.Close();
}

Executando o projeto teremos:

2- Criando um arquivo XML a partir de um DataSet e exibindo em um ListBox

Para realizar esta tarefa iremos usar o método WriteXml que grava os dados atuais (o esquema e dados) de um objeto DataSet para um arquivo XML. Este é um método sobrecarregado. Usando esse método, você pode gravar dados em um arquivo, fluxo, TextWriter ou XmlWriter.

O trecho de código a seguir grava um conteúdo do conjunto de dados para um arquivo XML usando o método WriteXml:

DataSet ds = CriarDataSet();
ds.WriteXml(@
"C:\Dados\Alunos.xml");

No menu File clique Add -> New Project e a seguir escolha Visua C# -> Windows e o template Windows Forms Application informando o nome XML_DataSet e clique em OK;

No formulário form1.cs do projeto inclua os seguintes controles:

A seguir no evento click do botão Gerar XML:

 private void btnGeraXML_Click(object sender, EventArgs e)
 {
            DataSet ds = CriarDataSet();
            ds.WriteXml(@"C:\dados\Alunos.xml");
            exibeXML();
 }

O código acima chama a rotina CriarDataSet() e usa o método WriteXML para gerar um arquivo xml na pasta c:\dados com o nome alunos.xml.

A rotina CriarDataSet() define um DataSet e cria um datatable com duas colunas Nome e Endereco atribuindo valores e retornando o dataset:

private DataSet CriarDataSet()
 {
            //cria um dataset
            DataSet ds = new DataSet("aluno");
            try
            {
                ds.Namespace = "AlunoNamespace";
                //define a tabela
                DataTable tabelaBasica = new DataTable("Aluno");
                //define as colunas
                DataColumn col1 = new DataColumn("Nome");
                DataColumn col2 = new DataColumn("Endereco");
                //inclua as colunas na tabela
                tabelaBasica.Columns.Add(col1);
                tabelaBasica.Columns.Add(col2);
                ds.Tables.Add(tabelaBasica);

                //inclua uma nova linha e atribui valores as colunas da tabela
                DataRow novaLinha;
                novaLinha = tabelaBasica.NewRow();
                novaLinha["Nome"] = "Jose Carlos Macoratti";
                novaLinha["Endereco"] = "Rua Projetada, 100";
                tabelaBasica.Rows.Add(novaLinha);

                novaLinha = tabelaBasica.NewRow();
                novaLinha["Nome"] = "Miriam Estela Lima";
                novaLinha["Endereco"] = "Alameda Santos, 45";
                tabelaBasica.Rows.Add(novaLinha);

                novaLinha = tabelaBasica.NewRow();
                novaLinha["Nome"] = "Jefferson Andre Bueno";
                novaLinha["Endereco"] = "Av. XV de Novembro 109";
                tabelaBasica.Rows.Add(novaLinha);

                ds.AcceptChanges();
                return ds;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message.ToString(), "Erro", MessageBoxButtons.OK);
                return ds;
            }
 }

O código da rotina exibeXML() que lê o arquivo alunos.xml e exibe os dados no controle ListBox:

   private void exibeXML()
    {
            try
            {
                ArrayList ar = new ArrayList();
                XmlTextReader reader = new XmlTextReader(@"C:\dados\alunos.xml");
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Text)
                    {
                        ar.Add(reader.Value);
                    }
                }
                lbXML.DataSource = ar;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message.ToString(), "Erro", MessageBoxButtons.OK);
            }
   }

Executando projeto iremos obter o resultado abaixo:

O arquivo alunos.xml gerado possui a seguinte estrutura:

<?xml version="1.0" standalone="yes"?>
<aluno xmlns="AlunoNamespace">
  <Aluno>
    <Nome>Jose Carlos Macoratti</Nome>
    <Endereco>Rua Projetada, 100</Endereco>
  </Aluno>
  <Aluno>
    <Nome>Miriam Estela Lima</Nome>
    <Endereco>Alameda Santos, 45</Endereco>
  </Aluno>
  <Aluno>
    <Nome>Jefferson Andre Bueno</Nome>
    <Endereco>Av. XV de Novembro 109</Endereco>
  </Aluno>
</aluno>

3- Gerando XML a partir de uma fonte de dados relacional

Vamos agora mostrar como podemos gerar um arquivo XML a partir de uma tabela de um banco de dados relacional exibindo o resultado em um controle DataGridView.

Vamos usar o método WriteXML da classe DataSet que escreve o conteúdo do dataset para um arquivo XML.

No menu File clique Add -> New Project e a seguir escolha Visua C# -> Windows e o template Windows Forms Application informando o nome XML_Relacional e clique em OK;

No formulário form1.cs do projeto inclua os seguintes controles:

Define o leiaute do formulário conforme a figura abaixo:

1- Gerando XML a partir do Microsoft Access

Vou usar um banco de dados Northwind.mdb e acessar a tabela Customers:

Defina os namespaces :

using System.Data;
using System.Data.OleDb;

No botão btnGerarXML_Access inclua o código a seguir:

 private void btnGerarXML_Access_Click(object sender, EventArgs e)
        {
            try
            {
                string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dados\Northwind.mdb";
                OleDbConnection conexaoOleDb = new OleDbConnection();
                conexaoOleDb.ConnectionString = connString;
                // cria um  data adapter
                OleDbDataAdapter da = new OleDbDataAdapter("Select * from Customers", conexaoOleDb);
                // cria new dataset
                DataSet ds = new DataSet();
                // preenche o  dataset
                da.Fill(ds, "Customers");
                // escreve o conteudo do dataset para um arquivo xml 
                ds.WriteXml(@"C:\dados\ClientesNorthwind.xml");
                exibeXML("ClientesNorthwind.xml");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message.ToString(), "Erro", MessageBoxButtons.OK);
            }
        }

O código acima acessa a tabela Customers selecionando todos os registros e gerando um dataset.

A seguir o método WriteXml do dataset gera o XML na pasta c:\dados;

Abrindo o arquivo gerado no controle DataGridView temos o resultado abaixo:

2- Gerando XML a partir do SQL Server

Vou usar um banco de dados Cadastro.mdf e acessar a tabela Contatos:

Defina os namespaces :

using System.Data;
using System.Data.SqlClient;

No botão btnGerarXML_SqlServer inclua o código a seguir:

 private void btnGerarXML_SQLServer_Click(object sender, EventArgs e)
        {
            try
            {
                string connString = @"Data Source=.\sqlexpress;Initial Catalog=Cadastro;Integrated Security=True";
                SqlConnection conexaoSQLServer = new SqlConnection();
                conexaoOleDb.ConnectionString = connString;
                // cria um  data adapter
                SqlDataAdapter da = new SqlDataAdapter("Select * from Contatos", conexaoSQLServer);
                // cria new dataset
                DataSet ds = new DataSet();
                // preenche o  dataset
                da.Fill(ds, "Contatos");
                // escreve o conteudo do dataset para um arquivo xml 
                ds.WriteXml(@"C:\dados\ContatosSQLServer.xml");
                exibeXML("ContatosSQLServer.xml");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message.ToString(), "Erro", MessageBoxButtons.OK);
            }
        }

O procedimento é o mesmo usado para o banco de dados Access o que muda é a string de conexão e o provedor SqlClient.

Abaixo temos o resultado da exibição do arquivo XML no datagridview:

A rotina para exibir o arquivo XML gerado possui o seguinte código:

private void exibeXML(string nomeArquivoXML)
{
            dgvXML.DataSource = null;
            DataSet dataSet = new DataSet();
            dataSet.ReadXml(@"C:\dados\" + nomeArquivoXML );
            dgvXML.DataSource = dataSet.Tables[0];
}

O método ReadXML do dataset lê o arquivo XML e exibe no controle.

Pegue o projeto completo aqui: XML_CSharp.zip

João 5:45 Não penseis que eu vos hei de acusar perante o Pai. Há um que vos acusa, Moisés, em quem vós esperais.

João 5:46 Pois se crêsseis em Moisés, creríeis em mim; porque de mim ele escreveu.

João 5:47 Mas, se não credes nos escritos, como crereis nas minhas palavras?

Veja os Destaques e novidades do SUPER DVD Visual Basic  (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C#  com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

Veja também os Cursos com vídeo aulas e projetos exemplos:

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti