Tutorial C# – Linq to XML
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).
Download: Código Linq to XML [110.59KB]
Se tiverem alguma duvida ou sugestão sabem onde me encontrar.
Boa programação
Licença: Freeware
Sistemas Operativos: Windows XP/Vista/Win7
Download: pplware Link to XML [32.69KB]
Homepage: Peopleware
Este artigo tem mais de um ano
Excelente. Continua o bom trabalho!
Boas…
Achei bastante bom e esclarecedor este tutorial. Actualmente ando também “brincando” às leituras de “files” em XML em técnologias diferentes (Python, Flex/ActionScript).
Continua o bom trabalho!
🙂
Boas,
venho ao blog todos os dias,
primeiro comentario.. funcionou impecavel com o visual web express 2008 que tambem compila c#
aquele abraço
DEVAXTATOR
@Offtopic:
Beta do Visual Studio 2010 ja esta ca fora, uma review seria bastante interessante.
Muito bom, continua!
Já agora a tal review do VS2010 beta era bem vinda! 😉
Bem, a uma maneira muito mais “fácil” e a qual precisas de muito menos código para trabalhares com XML no C#.
Basta fazeres Deserialize/Serialize do ficheiro XML.
Faz pesquisa por XMLSerialize no site do MSDN e teras a maneira como é feito.
Caso nao consigas e estejas interessado, podes contactar-me pelo mail…
Obrigado pelo conselho, mas já aqui falei de serialização.
https://pplware.sapo.pt/2009/03/23/tutorial-c-databindings-e-serialization/
Ficou muito legal a explicação.
Viva, primeiro que tudo, obrigado pelo post e pelo bom trabalho!
Gostaria de uma pequena ajuda, se possível:
O Ficheiro xml apresentado neste exemplo é o seguinte:
Angels & Deamons
…
Pelo que a respectiva query de acesso será:
var query =
from Filme in Filmes.Elements(“Filme”)
select Filme.Element(“Titulo”);
No entanto, se o XML possuir uma outra estrutura, como por exemplo:
Angels & Deamons
…
Como ficará a query em linq para aceder ao titulo?
Obrigado desde já.
Cumprimentos
Incluí código xml no comentário, e este desapareceu. segue na imagem em anexo:
Uploaded with ImageShack.us
Ficheiro xml apresentado neste exemplo é o seguinte:
Filmes
Filme
titulo Angels & Demons /titulo
…Pelo que a respectiva query de acesso será:
var query =
from Filme in Filmes.Elements(“Filme”)
select Filme.Element(“Titulo”);
No entanto, se o XML possuir uma outra estrutura, como por exemplo:
Movies
Series
Filmes
titulo Angels & Demons /titulo
Como ficará a query em linq para aceder ao titulo?Obrigado desde já.Cumprimentos
Valeu, a matéria é esclarecedora. Muito bom, me ajudou bastante. Continue assim.
Muito bom o post, muito útil, parabéns!
boa tarde,
eu precisava de 2 ajudas caso seja possível.
Sou novato no c# e linq to xml, no entanto estou a construir uma pequena aplicação para uso pessoal.
o meu primeiro problema é:
new XDeclaration(“1.0”, “ISO-8859-1”, “”) no ficheiro gerado aparece iso-8859-1 e deveria ser em maiusculas porque depois o programa de validação diz que o enconding iso-8859-1 é diferente de ISO-8859-1.
O meu segundo problema é:
tenho várias textboxes e consigo escrever no ficheiro xml, com o linq to xml.
No entanto tenho para minha facilidade uma gridview com 4 colunas para inserir dados e precisava de exportar também para o xml.
alguém me pode ajudar quanto a estas questões?
obrigado.
Parabens pelo conteúdo. Bem explicativo…. se precisar de algum help entro em contato sim….