XDocument - Manipulando arquivos XML no .NET

Veja neste artigo uma breve introdução ao XML e como usar o mesmo no .NET, veremos como manipula documentos com este formato.

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.


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.


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.

Artigos relacionados