Um dos formatos de arquivos mais utilizados para armazenamento de informações é, sem dúvidas, o XML, por ser um padrão compatível com a maioria das linguagens comerciais da atualidade. Um exemplo comum disso é a Nota Fiscal Eletrônica, onde os dados são enviados e recebidos neste formato, seguindo o padrão especificado pelos órgãos competentes.

O .NET Framework, como boa ferramenta que é, nos fornece uma série de recursos para trabalhar com esse tipo de arquivo, permitindo importar, exportar e consultar informações no formato XML de forma simples.

Apesar de existir mais de uma classe para esse fim, veremos neste artigo como utilizar a classe XDocument, contida no namespace System.Linq.Xml, para importar, consultar e alterar um arquivo XML de estrutura previamente conhecida.

A Listagem 1 exibe o conteúdo do arquivo pessoas.xml, utilizado nos exemplos deste artigo.

Listagem 1: Arquivo pessoas

            <?xml version="1.0" encoding="UTF-8"?>
            <pessoas>
                <pessoa id="1" nome="João"/>
                <pessoa id="2" nome="Maria"/>
                <pessoa id="3" nome="José"/>
            </pessoas>
            

A estrutura é bastante simples, uma vez que objetivo deste artigo é apenas apresentar os principais métodos e propriedades da class supracitada.

Vamos então criar uma aplicação Windows forms e configurar o form principal de forma igual ou semelhante ao que ilustra a Figura 1.

Layout do form principal

Figura 1: Layout do form principal

Temos um DataGridView (dgvDados) e dois TextBoxes (txtID e txtNome) que serão utilizados para exibição e alteração dos dados.

O botão salvar funcionará da seguinte forma: caso o campo txtID contenha o ID de uma pessoa já cadastrada, o nome desta será alterado, caso contrário, um novo registro será adicionado à lista.

Para manipularmos os itens do arquivo de forma mais clara, usaremos uma classe Pessoa, conforme mostra a Listagem 2.

Listagem 2: Classe Pessoa

            class Pessoa
            {
            string id;
            string nome;
            
            public string Id
            {
            get { return id; }
            set { id = value; }
            }
            
            public string Nome
            {
            get { return nome; }
            set { nome = value; }
            }
            }
            

Temos apenas dois campos simples, da mesma forma que no arquivo XML.

Carregando o XML

Carregar o XML é, sem dúvida, a parte mais simples deste artigo. A classe XDocument dispõe de várias formas para realizar esta ação, das quais utilizaremos uma, carregando o documento a partir de seu nome. Primeiramente devemos declarar um objeto XDocument como global, seguindo o exemplo da Listagem 3. Este objeto será instanciado no evento Load do form, visto mais adiante.
Listagem 3: Declaração do objeto XDocument

            XDocument doc;
        

Escreveremos então um método para carregar este arquivo e montar uma lista de Pessoas e exibir essa lista no grid. Devemos, em seguida, invocar este evento no evento Load do form.

Listagem 4: Carregando XML e exibindo os dados

            public void CarregarXML()
            {
            XDocument doc = XDocument.Load(@"C:\pessoas.xml");
            List<Pessoa> pessoas = new List<Pessoa>();
            foreach (XElement x in doc.Element("pessoas").Elements())
            {
            Pessoa p = new Pessoa()
            {
            Id = x.Attribute("id").Value,
            Nome = x.Attribute("nome").Value
            };
            pessoas.Add(p);
            }
            dgvDados.DataSource = pessoas;
            }    
        

Lemos todos os elementos contidos no elemento “pessoas” do XML e, para cada item lido, utilizamos seus atributos para preencher um objeto do tipo Pessoa e adicioná-lo à lista. Ao fim, definimos esta lista como DataSource do grid dgvDados. Com isso, teremos todos os registros listados no grid, como pode ser visto na Figura 2.

Listados os itens do arquivo XML

Figura 2: Listados os itens do arquivo XML

O próximo passo é programar o evento SelectionChanged do grid para exibir os dados do registro selecionado nos textboxes. A Listagem 4 apresenta o código utilizado para realizar esta ação.

Listagem 4: Exibição dos dados nos textboxes

            private void dgvDados_SelectionChanged(object sender, EventArgs e)
            {
            if (dgvDados.SelectedRows.Count > 0)
            {
            txtId.Text = dgvDados.SelectedCells[0].Value.ToString();
            txtNome.Text = dgvDados.SelectedCells[1].Value.ToString();
            }
            }
        

É importante que os dados sejam exibidos nos textboxes, pois utilizaremos estes valores para programar o evento Click do botão salvar, o que é mostrado na Listagem 5 a seguir.

Alterando e adicionando elementos

Listagem 5: Evento Click do botão Salvar

            private void button1_Click(object sender, EventArgs e)
            {
            if (doc.Element("pessoas").Elements().Where(x => x.Attribute("id").Value.Equals(txtId.Text)).Count() > 0)
            {
            XElement ele = doc.Element("pessoas").Elements().Where(x => x.Attribute("id").Value.Equals(txtId.Text)).First();
            ele.Attribute("nome").SetValue(txtNome.Text);
            doc.Save(@"C:\pessoas.xml");
            CarregarXML();
            }
            else
            {
            XElement ele = new XElement("pessoa");
            ele.Add(new XAttribute("id", txtId.Text));
            ele.Add(new XAttribute("nome", txtNome.Text));
            doc.Element("pessoas").Add(ele);
            doc.Save(@"C:\pessoas.xml");
            CarregarXML();
            }
            }
        

Podemos agora executar a aplicação e testar. Primeiramente selecionando uma linha no grid, alterando o nome e então clicando no botão Salvar. O registro selecionado deve ser alterado e o arquivo salvo. Outro teste pode ser realizado digitando um Id inexistente, um Nome e clicando também no botão Salvar. O registro deve ser adicionado à lista e salvo no arquivo.

Como foi visto, manipular arquivos XML torna-se uma tarefa simples quando utilizamos os recursos fornecidos pelo framework. Com algumas poucas linhas de código autodescritivas, pudemos carregar um arquivo XML, alterar e inserir novos elementos e atributos em sua estrutura e salvá-lo ao fim.

Com isso finalizamos este breve artigo. Espero que o conteúdo possa ser útil.

Até a próxima.