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.
<?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.
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.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.
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.
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
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.