Olá a todos hoje vou-vos falar de Linq to XML. Já abordei num post anterior este tema mas mais especifico para Datasets.
Neste tutorial vou-vos mostrar como podem interagir com ficheiros XML, para isso vamos criar uma pequena aplicação que vai permitir gerir uma base de dados de filmes.
Neste tutorial:
Vamos navegar, adicionar, editar e apagar elementos de um ficheiro XML através de LINQ, e como irão ver é muito simples e numa sintaxe muito intuitiva.
Navegar:
Para navegar por um ficheiro XML temos de o abrir primeiro.
XElement Filmes = XElement.Load(caminho);
Para vermos os elementos na nossa form utilizei uma treeview, vamos carregar todos os títulos provenientes do ficheiro XML, para isso fazemos uma query LINQ,
var query =
from Filme in Filmes.Elements(“Filme”)
select Filme.Element(“Titulo”);
Carregamos a variável query com os dados do XML, ao encontrar um elemento “Filme” que é o pai vai retornar todos os “Titulos”.
foreach (var filme in query)
{
TreeNode childNode = new TreeNode(filme.Value);
node.Nodes.Add(childNode);
}
Para cada titulo adicionamos o seu Texto á treeview.
Adicionar:
Para adicionar temos de abrir o ficheiro novamente.
E criamos um XELement, com a utilização de LINQ este processo ficou mais simples, é só irmos adicionando novos elementos ou atributos encadiados, neste exemplo criamos um novo filme em que abrimos a tag ”Filme” no inicio e só fechamos no final para este se tornar o pai, os outros elementos são criados e logo fechados, para assim não conterem filhos.
XElement novoFilme = new XElement(“Filme”, // Começo do elemento Filme
new XElement(“Titulo”, textBox5.Text), // Adicionado o elemento Titulo
new XElement(“Rating”, textBox6.Text), // Adicionado o elemento Rating
new XElement(“Data”, textBox4.Text) // Adicionado o elemento Data
); // Fim do elemento Filme
Por fim adicionamos este elemento “Filme” ao ficheiro.
Filmes.Add(novoFilme); // Adicionamos o novo filme ao xml
Filmes.Save(caminho); // Temos de gravar as alterações para o ficheiro
Editar:
Para editar o processo é muito semelhante, a única diferença é que em vez de ser do tipo var o elemento tem de ser do tipo “IEnumerable” para assim podermos aceder ás propriedados dos XElements do loop foreach.
A query também sofre uma alteração, em que vamos comparar com uma clausula Where se o titulo do elemento é igual ao item que está seleccionado na treeview.
where ((string)b.Element(“Titulo”)).Equals(treeView1.SelectedNode.Text)
No loop como temos acesso ás propriedados do XElement vamos executar a seguinte instrução para alterar os valores.
ex.SetElementValue(“Titulo”, textBox1.Text);
Como sempre no final temos de gravar o ficheiro.
Apagar:
O método de apagar é muito semelhante ao editar em que temos de compara o valor do titulo com um node no ficheiro XML depois de encontrado esse valor fazemos um loop e usamos o método
ex.Element(“Titulo”).Parent.Remove();
Com esta instrução apagamos o pai deste “Titulo”, ou seja, apagamos o filme e todos os seus filhos.
Para aceder ás propriedades como disse anteriormente a variável da query não pode ser var mas sim um XElement.
Navegação 2:
Um dos comportamentos do programa é ao clicar num item da treeview ele popula umas textboxes com os valores desse filme, para fazer isso é muito simples.
Abrimos o ficheiro como sempre.
Depois na query a grande diferença é que adicionamos propriedades á variável var da query para assim podermos aceder a elas no foreach
select new
{
Titulo = (string)b.Element(“Titulo”),
Rating = (string)b.Element(“Rating”),
Data = (string)b.Element(“Data”)
};
Este pedaço de código vai tornar possível aceder ás propriedades da variável resultante da query, e também ficam disponíveis no intellisense.
Depois no loop preenchemos as textboxes com os valores.
foreach(var dados in Filme) // a var dados já tem as novas propriedades
{
textBox1.Text = dados.Titulo;
textBox2.Text = dados.Rating;
textBox3.Text = dados.Data;
}
Bom por hoje é tudo espero que tenham gostado. Como podem ver e já o referi num post anterior o Linq é uma Framework muito poderosa, simples e muito útil para tudo (quando digo tudo é mesmo tudo).
Se tiverem alguma duvida ou sugestão sabem onde me encontrar.
Boa programação