none
Deserializar XML C# RRS feed

  • Pergunta

  • Bom dia pessoal!!!

    Estou com alguns problemas para deserializar um arquivo xml... é a primeira vez que estou trabalhando com isto então surgiram claro alguns problemas...

    seguinte, tenho um arquivo simples de xml... conforme segue abaixo...

    <?xml version="1.0" encoding="iso-8859-1"?>
    <conteudo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <produtos>
            <produto>
                <codproduto>316632</codproduto>
                <nomeproduto>Aparador Cerca Trapp HT500 220V</nomeproduto>
            </produto>
        </produtos>
    </conteudo>

    Pegando alguns exemplo na internet eu montei uma classe chamada Produtos como mostra abaixo:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml.Serialization;

    namespace deserializar
    {
        [Serializable]
        [XmlRoot(ElementName = "conteudo")]
        public class Produtos
        {
            private string _codigoproduto;
            private string _nomeproduto;

            [XmlElement(ElementName = "codproduto")]
            public string codigoproduto
            {
                get { return _codigoproduto; }
                set { _codigoproduto = value; }
            }

            [XmlElement(ElementName = "nomeproduto")]
            public string nomeproduto
            {
                get { return _nomeproduto; }
                set { _nomeproduto = value; }
            }
        }
    }

    onde eu preciso apenas pegar os valores das tags "codigoproduto" e "nomeproduto", no meu form principal Form1 eu coloquei um botão com o evento click para mostrar na tela o resultado, segue o código que eu usei para deserializar:

            private void button2_Click(object sender, EventArgs e)
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Produtos));
                Stream reader = new FileStream(@"c:\teste.xml", FileMode.Open);
                Produtos i;
                i = (Produtos)serializer.Deserialize(reader);
                richTextBox1.Text = i.codigoproduto + " - " + i.nomeproduto;
            }

    Porém deve estar faltando algumas coisas das quais eu não sei ainda... Não está retornando nada... alguém pode dar alguma dica... ?????

    Agradeço desde já pessoal
    Abraço
    terça-feira, 7 de abril de 2009 13:17

Respostas

  • Olá,

    Por acaso vc já tentou ler esse XML através de um DataSet, por exemplo??? É uma maneira bem simples de carregar o XML...

    DataSet ds = new DataSet();
    ds.ReadXml(@"c:\seuxml.xml");

    Abraços
    Thiago J. Mônaco
    terça-feira, 7 de abril de 2009 17:45
    Moderador
  • Opa,

    Que bom que a dica funcionou... Agora vamos a outra dúvida...

    O método ReadXml possui algumas sobrecargas, e uma delas aceita uma Stream como parâmetro, vc pode usar esta opção para carregar seu DataSet, veja:

    string teste = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><conteudo><produto><codproduto>316632</codproduto><nomeproduto>Aparador Cerca Trapp HT500 220V</nomeproduto></produto></conteudo>";
    
    System.IO.StringReader stream = new System.IO.StringReader(teste);
    DataSet ds = new DataSet();
    ds.ReadXml(stream);
    Depois se quiser acessar informações individuias, a base seria essa:

    Response.Write(ds.Tables["produto"].Rows[0]["nomeproduto"].ToString());
    Abraços
    Thiago J. Mônaco
    • Marcado como Resposta Leosul quarta-feira, 8 de abril de 2009 15:01
    quarta-feira, 8 de abril de 2009 14:47
    Moderador

Todas as Respostas

  • Olá Leosul,

    Nesse link tem um exemplo de como você pode trabalhar com serialização e deserialização de objeto

    http://danielfonsecacastro.spaces.live.com/default.aspx?_c01_BlogPart=blogentry&_c=BlogPart&handle=cns!707C31973BDE58D2!186
    Se a resposta for útil por favor não esqueça de marca.
    Abraços,
    www.danielfonsecacastro.com.br
    Daniel Fonseca Castro
    terça-feira, 7 de abril de 2009 16:05
  • Olá Daniel...

    Na verdade minha grande dúvida é de como deserializar um xml que contém vários nós... tipo como eu crio as classes e faço com que cada uma esteja ligada com a outra... na verdade a dúvida é como montar estas classes e se esta é a melhor maneira de fazer..

    entendeu ??
    valeuuu
    terça-feira, 7 de abril de 2009 16:42
  • Olá,

    Por acaso vc já tentou ler esse XML através de um DataSet, por exemplo??? É uma maneira bem simples de carregar o XML...

    DataSet ds = new DataSet();
    ds.ReadXml(@"c:\seuxml.xml");

    Abraços
    Thiago J. Mônaco
    terça-feira, 7 de abril de 2009 17:45
    Moderador
  • Olá Leosul ,

    Na verdade  você não tem que se preocupar com isso, a classe XmlSerializer faz todo o trabalho para você, agora sobre montar a classe, você deve montar da melhor forma possível para representar o mundo real seguindo aquele velho conceito de OOP !
    Aqui segue um exemplo com uma classe com varios objetos eu serializo e deserializo sem me preocupar como isso será feito

     public class Cliente
        {
            public Cliente()
            {
                this.Pedido = new Pedido();
                this.Id = 1;
                this.Nome = "Cliente 1";
            }
            public int Id { get; set; }
            public string Nome { get; set; }
            public Pedido Pedido { get; set; }
        }
    
        public class Pedido
        {
            public Pedido()
            {
                this.Loja = new Loja
                {
                    Id = 1,
                    Nome = "Loja 1"
                };
    
                this.Livro = new List<Livro>();
                this.Livro.Add(new Livro
                {
                    Id = 1,
                    Nome = "ASP.NET ",
                    Descricao = "Versão Atualizada",
                    Preco = 120.00d
                });
    
                this.Livro.Add(new Livro
                {
                    Id = 1,
                    Nome = "C#",
                    Descricao = "Veja as novidades do C#",
                    Preco = 110.00d
                });
    
                this.Livro.Add(new Livro
                {
                    Id = 1,
                    Nome = "Linq",
                    Descricao = "Aprenda Linq",
                    Preco = 100.00d
                });
            }
            public Loja Loja { get; set; }
            public List<Livro> Livro { get; set; }
        }
    
        public class Loja
        {
            public int Id { get; set; }
            public string Nome { get; set; }
        }
    
        public class Livro
        {
            public int Id { get; set; }
            public string Descricao { get; set; }
            public string Nome { get; set; }
            public double Preco { get; set; }
        }
    Aqui a utilização

    public static void Main()
            {
                Cliente cliente = new Cliente();
                
                //Serializando objeto 
                System.Xml.Serialization.XmlSerializer serializer = new XmlSerializer(typeof(Cliente));
                TextWriter writer = new StreamWriter("cliente.xml");
                serializer.Serialize(writer, cliente);
                writer.Close();
    
                //Deserializado objeto 
                FileStream fs = new FileStream("cliente.xml", FileMode.Open);
                Cliente clienteDeserializado = serializer.Deserialize(fs) as Cliente;
                fs.Close();
    
                //Mostra cliente deserializado
                Console.WriteLine("Id : {0}", clienteDeserializado.Id);
                Console.WriteLine("Nome : {0}", clienteDeserializado.Nome);
                Console.WriteLine("Id da loja : {0}", clienteDeserializado.Pedido.Loja.Id);
                Console.WriteLine("Nome da loja : {0}", clienteDeserializado.Pedido.Loja.Nome);
    
                //Produtos
                foreach (var item in clienteDeserializado.Pedido.Livro)
                    Console.WriteLine("Id : {0},Descrição : {1}, Nome : {2}, Preço : {3}", item.Id, item.Descricao, item.Nome, item.Preco);
    
                Console.Read();
            }

    Se a resposta for útil por favor não esqueça de marca.
    Abraços,
    www.danielfonsecacastro.com.br
    Daniel Fonseca Castro
    terça-feira, 7 de abril de 2009 17:51
  • olá, uma vez tive um problema semelhante, eu estava a usar NetworkStream, a razao era porque eu  quando depois de fazer Serialize nao fechava o stream.podia colocar o codigo que usa para fazer o Serialize?
    sou o rafael, sou de portugal e sou aluno de informatica
    terça-feira, 7 de abril de 2009 20:37
  • Bom dia Thiago!

    Consegui usar o DataSet... ficou perfeito, com isso algumas outras dúvidas surgiram.... por exemplo:

    Quando eu faço uma solicitação para o servidor de webservice por exemplo passando um xml com código de produto eu devo receber o código novamente com a descrição deste produto, é possível eu colocar este retorno dentro do dataset tbm ??? por exemplo:

    string retorno = retorno do webservice com os valores "Código Produto" e "Nome Produto"

    DataSet ds = new DataSet();
    ds.ReadXml(retorno);

    Pelos teste que eu fiz não funcionaria, então a pergunta é... neste caso eu teria sempre que gravar um arquivo fisicamente em disco para pode usar o DataSet ??? ou existe outra forma sem precisar gravar em disco ???

    Outra coisa... como eu faço por exemplo para pegar os valores do dataset sem precisar trabalhar com grid ou seja se eu precisar colocar o "Código Produto" na tela em um TextBox por exemplo...


    grande abraço e obrigado pela ajuda
    quarta-feira, 8 de abril de 2009 13:57
  • Opa,

    Que bom que a dica funcionou... Agora vamos a outra dúvida...

    O método ReadXml possui algumas sobrecargas, e uma delas aceita uma Stream como parâmetro, vc pode usar esta opção para carregar seu DataSet, veja:

    string teste = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><conteudo><produto><codproduto>316632</codproduto><nomeproduto>Aparador Cerca Trapp HT500 220V</nomeproduto></produto></conteudo>";
    
    System.IO.StringReader stream = new System.IO.StringReader(teste);
    DataSet ds = new DataSet();
    ds.ReadXml(stream);
    Depois se quiser acessar informações individuias, a base seria essa:

    Response.Write(ds.Tables["produto"].Rows[0]["nomeproduto"].ToString());
    Abraços
    Thiago J. Mônaco
    • Marcado como Resposta Leosul quarta-feira, 8 de abril de 2009 15:01
    quarta-feira, 8 de abril de 2009 14:47
    Moderador
  • Thiago,

    Gostaria de agradecer pelas dicas, muito bem formuladas e com práticos exemplos...

    Valeuuu

    Grande abraço
    quarta-feira, 8 de abril de 2009 15:02
  • Olá,

    Por acaso vc já tentou ler esse XML através de um DataSet, por exemplo??? É uma maneira bem simples de carregar o XML...

    DataSet ds = new DataSet();
    ds.ReadXml(@"c:\seuxml.xml");

    Abraços
    Thiago J. Mônaco
    Thiago mônaco.... valeu...
    sua dia resolveu meu problema....100%

    terça-feira, 5 de maio de 2009 11:21