Tutorial C# – Linq to XML

15 Comentários

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

Autor: Pplware
Partilhar:

Comentários

15

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de JoniD
    JoniD

    Excelente. Continua o bom trabalho!

    1. Avatar de Nuno Mestre
      Nuno Mestre

      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!

      🙂

  2. Avatar de DEVAXTATOR

    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

  3. Avatar de Shogun
    Shogun

    @Offtopic:

    Beta do Visual Studio 2010 ja esta ca fora, uma review seria bastante interessante.

  4. Avatar de Telmo
    Telmo

    Muito bom, continua!

    Já agora a tal review do VS2010 beta era bem vinda! 😉

  5. Avatar de Ricardo
    Ricardo

    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…

    1. Avatar de Henrique Graça
      Henrique Graça

      Obrigado pelo conselho, mas já aqui falei de serialização.

      http://www.pplware.com/2009/03/23/tutorial-c-databindings-e-serialization/

  6. Avatar de raphael
    raphael

    Ficou muito legal a explicação.

  7. Avatar de Ahtos
    Ahtos

    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

    1. Avatar de Ahtos
      Ahtos

      Incluí código xml no comentário, e este desapareceu. segue na imagem em anexo:

      Uploaded with ImageShack.us

    2. Avatar de Ahtos
      Ahtos

      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

  8. Avatar de Jader de Andrade
    Jader de Andrade

    Valeu, a matéria é esclarecedora. Muito bom, me ajudou bastante. Continue assim.

  9. Avatar de Marcelo
    Marcelo

    Muito bom o post, muito útil, parabéns!

  10. Avatar de Tribuna
    Tribuna

    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.

  11. Avatar de André Araújo
    André Araújo

    Parabens pelo conteúdo. Bem explicativo…. se precisar de algum help entro em contato sim….