none
Como alimentar um ObservableCollection com dados de um aquivo XML? RRS feed

  • Pergunta

  • Olá amigos

    Gostaria de saber se é possivel pegar os dados de um arquivo XML, contendo dados de clientes ( ClienteID, ClienteName e ClienteCountry) e alimentar um ObservableCollection. Estou usando um ListBox/ListView para exibir os dados. Eu consigo exibir os dados diretamente no ListBox/ListView mas quando tento mover o item selecionado para outro ListBox/ListView dá erro, somente consegui usando collection, so que agora quero trabalhar com dados do Arquivo XML e nao mais inseridos por mim.

    obrigado desde já
    segunda-feira, 8 de fevereiro de 2010 19:04

Respostas

  • Você pode usar LinqToXML:

    var query = from c in document.Elements("Clientes")
                      select new Cliente {ClienteID = c.Element("ClienteID"),
                                        ClienteName = c.Element("ClienteName"),
                                        ClienteCountry = c.Element("ClienteCountry")};
    var coll = new ObservableCollection<Cliente>(query.ToList());

    Bruno

    MVP Client Development - http://msmvps.com/blogs/bsonnino
    • Sugerido como Resposta AndreAlvesLimaModerator quarta-feira, 10 de fevereiro de 2010 12:02
    • Marcado como Resposta Leibnitz sexta-feira, 19 de fevereiro de 2010 01:45
    quarta-feira, 10 de fevereiro de 2010 11:28
  • Leibnitz,

    não sou expert no assunto mas tb estou aprendendo agora e já consegui fazer algumas coisas, então vou tentar ajudar você.

    Quando você dispara o var query = from c in document.Elements("Clientes") você vai pegar a query com todos os nodes filho do clientes pra baixo.

    Ai vem o comando Select. Se você der um:
    from c in document.Elements("Clientes")
           select c;

    pra cada node que ele encontrar, ele vai ser um objeto do query. Então se você der um query.ToList() neste ponto, ele vai retornar os xmls assim por exemplo:

    item do array na posição 0 (query.ToList()[0]) = <Cliente><ID>1</ID><Nome>Leandro</Nome></Cliente>
    item do array na posição 1 (query.ToList()[1]) = <Cliente><ID>2</ID><Nome>Marcelo</Nome></Cliente>

    e assim por diante.

    Mas caso você queira, pode transformar isso em objeto pra ficar melhor de ler depois, pra isso basta dar um new:

    select new //você ta criando um novo objeto pra cada resultado que o comando from encontrar
    {
         ClienteID = c.Element("ID").Value.Tostring();
         ClienteNOME = c.Element("Nome").Value.Tostring();//lembrando que é case sensitive. Note que o ID é maiusculo todo, mas o Nome não
    }

    Agora, se você der um query.ToList(), na posição 0 vai ter um objeto com duas propriedades. Então

    foreach(var cliente in query.ToList())
    {
         MessageBox.Show(cliente.ClienteNOME);//vai aparecer LEANDRO, e depois vai aparecer Marcelo e assim por diante. Cada var cliente guarda um elemento do cliente do xml
    }
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    • Marcado como Resposta Leibnitz sexta-feira, 19 de fevereiro de 2010 01:44
    sexta-feira, 12 de fevereiro de 2010 18:25

Todas as Respostas

  • Você pode usar LinqToXML:

    var query = from c in document.Elements("Clientes")
                      select new Cliente {ClienteID = c.Element("ClienteID"),
                                        ClienteName = c.Element("ClienteName"),
                                        ClienteCountry = c.Element("ClienteCountry")};
    var coll = new ObservableCollection<Cliente>(query.ToList());

    Bruno

    MVP Client Development - http://msmvps.com/blogs/bsonnino
    • Sugerido como Resposta AndreAlvesLimaModerator quarta-feira, 10 de fevereiro de 2010 12:02
    • Marcado como Resposta Leibnitz sexta-feira, 19 de fevereiro de 2010 01:45
    quarta-feira, 10 de fevereiro de 2010 11:28
  • Caro Bruno

    Obrigado por responder tão prontamente minha dúvida.
    Comecei a pesquisar mais sobre o LinQtoXML.

    Eu tentei utilizar as instruções no meu UserControl mas encontrei alguns erros, então vou tentar absorver e aprender o maximo dessa sua ajuda:

    Alguns exemplos me ensinaram as seguintes instruções:

    XDocument xml = XDocument.Load("ClientsData.xml"); //Com isso eu crio um Xdocument que carrega os dados do meu XML - ClientsData.xml.

    var query = from c in document.Elements("Clientes")  //aqui eu crio uma query que vai indicar os campos do XML com os Campos do Collection?
                      select new Cliente {ClienteID = c.Element("ClienteID"),
                                        ClienteName = c.Element("ClienteName"),
                                        ClienteCountry = c.Element("ClienteCountry")};
    var coll = new ObservableCollection<Cliente>(query.ToList()); // Aqui eu estou criando a coleção e o Cliente é a base de dados da coleção?

    desculpe as perguntas básicas mas estou aprendendo ainda.

    agradeço desde já.




    quinta-feira, 11 de fevereiro de 2010 17:57
  • Leibnitz,

    não sou expert no assunto mas tb estou aprendendo agora e já consegui fazer algumas coisas, então vou tentar ajudar você.

    Quando você dispara o var query = from c in document.Elements("Clientes") você vai pegar a query com todos os nodes filho do clientes pra baixo.

    Ai vem o comando Select. Se você der um:
    from c in document.Elements("Clientes")
           select c;

    pra cada node que ele encontrar, ele vai ser um objeto do query. Então se você der um query.ToList() neste ponto, ele vai retornar os xmls assim por exemplo:

    item do array na posição 0 (query.ToList()[0]) = <Cliente><ID>1</ID><Nome>Leandro</Nome></Cliente>
    item do array na posição 1 (query.ToList()[1]) = <Cliente><ID>2</ID><Nome>Marcelo</Nome></Cliente>

    e assim por diante.

    Mas caso você queira, pode transformar isso em objeto pra ficar melhor de ler depois, pra isso basta dar um new:

    select new //você ta criando um novo objeto pra cada resultado que o comando from encontrar
    {
         ClienteID = c.Element("ID").Value.Tostring();
         ClienteNOME = c.Element("Nome").Value.Tostring();//lembrando que é case sensitive. Note que o ID é maiusculo todo, mas o Nome não
    }

    Agora, se você der um query.ToList(), na posição 0 vai ter um objeto com duas propriedades. Então

    foreach(var cliente in query.ToList())
    {
         MessageBox.Show(cliente.ClienteNOME);//vai aparecer LEANDRO, e depois vai aparecer Marcelo e assim por diante. Cada var cliente guarda um elemento do cliente do xml
    }
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    • Marcado como Resposta Leibnitz sexta-feira, 19 de fevereiro de 2010 01:44
    sexta-feira, 12 de fevereiro de 2010 18:25
  • Leandro, meu caro amigo.

    Obrigado pela resposta. Foi de grande valia.

    Eu consegui finalmente exibir corretamente, manipular de forma correta. gostaria de agradecer aos amigos por tudo.

    Desculpe pela resposta tardia, foi carnaval aqui em salvador, sabe como e...

    abraços a todos.
    sexta-feira, 19 de fevereiro de 2010 01:44