none
Deserializar arquivo xml de uma web api RRS feed

  • Pergunta

  • Olá, estava estudando deserialização de um arquivo xml e transformar em um tipo de dado porém ele me traz o seguinte erro:

     Exceção gerada: 'System.InvalidOperationException' em System.Xml.dll
    Ocorreu uma exceção do tipo "System.InvalidOperationException" em System.Xml.dll, mas ela não foi manipulada no código do usuário
    Erro no documento XML (1, 1).

    estou utilizando este código:

            public async void Acess()
            {
                using (HttpClient client = new HttpClient())
                {
                    client.BaseAddress = new Uri("http://localhost:55833/api/pessoafisica/" + "04012802178");
                    var resposta = await client.GetAsync("");

                    string dados = await resposta.Content.ReadAsStringAsync();
                    StringReader stringReader = new StringReader(dados);
                    XmlSerializer xml = new XmlSerializer(typeof(List<PessoaFisica>), new XmlRootAttribute("PessoaFisica"));
                    List<PessoaFisica> pessoas = (List<PessoaFisica>)xml.Deserialize(stringReader);
                }
            }

    quinta-feira, 19 de julho de 2018 14:50

Respostas

  • Você precisa Decorar a classe indicando seu namespace, para então o XML conseguir deserializar.

    class Program
    {
        static void Main(string[] args)
        {
            var xmlContent = new StringReader("<PessoaFisica xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/esusWebApi.Models\">\r\n  <Cns>159357123456789</Cns>\r\n  <Cpf>04012802178</Cpf>\r\n  <Id>3089</Id>\r\n  <Nascimento>1993-05-08T12:00:00</Nascimento>\r\n  <Nome>TESTE TI</Nome>\r\n</PessoaFisica>");
            XmlSerializer xml = new XmlSerializer(typeof(PessoaFisica));
            var pessoas = (PessoaFisica)xml.Deserialize(xmlContent);
        }
    }
    
    [XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/esusWebApi.Models")]
    public partial class PessoaFisica
    {
    
        public int Id { get; set; }
        public string Cpf { get; set; }
        public string Cns { get; set; }
        public string Nome { get; set; }
        public DateTime Nascimento { get; set; }
    }




    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br


    • Editado Bruno Brito quinta-feira, 19 de julho de 2018 18:36
    • Marcado como Resposta Milzerk sexta-feira, 20 de julho de 2018 11:07
    quinta-feira, 19 de julho de 2018 18:33
  • O erro era por que a classe PessoaFisica nao estava com o atributo XmlRoot.

    [XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/esusWebApi.Models")]

    O detalhe está no namespace. Ele é o mesmo do atributo {xmlns=} que sua aplicação recebe no XML.


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    • Marcado como Resposta Milzerk sexta-feira, 20 de julho de 2018 11:07
    quinta-feira, 19 de julho de 2018 22:51

Todas as Respostas

  • Existe algum problema no mapeamento do Xml. Para melhor te ajudar é possivel disponibilizar o conteúdo do Xml e a classe PessoaFisica?

    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    quinta-feira, 19 de julho de 2018 17:11
  • Essa é a classe pessoa fisica

    using System;

    namespace WebApiCliente.Model
    {
        public class PessoaFisica
        {

            public int Id { get; set; }
            public string Cpf { get; set; }
            public string Cns { get; set; }
            public string Nome { get; set; }
            public DateTime Nascimento { get; set; }

        }
    }

    Esse é o conteúdo: 

    <PessoaFisica xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/esusWebApi.Models">
    <Cns>159357123456789</Cns>
    <Cpf>04012802178</Cpf>
    <Id>3089</Id>
    <Nascimento>1993-05-08T12:00:00</Nascimento>
    <Nome>TESTE TI</Nome>

    </PessoaFisica>

    Também alterei o método de deserialização. tirando o List<PessoaFisica> para apenas PessoaFisica. por buscar apenas uma pessoa. mas o erro permanece


    quinta-feira, 19 de julho de 2018 17:21
  • Você precisa Decorar a classe indicando seu namespace, para então o XML conseguir deserializar.

    class Program
    {
        static void Main(string[] args)
        {
            var xmlContent = new StringReader("<PessoaFisica xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/esusWebApi.Models\">\r\n  <Cns>159357123456789</Cns>\r\n  <Cpf>04012802178</Cpf>\r\n  <Id>3089</Id>\r\n  <Nascimento>1993-05-08T12:00:00</Nascimento>\r\n  <Nome>TESTE TI</Nome>\r\n</PessoaFisica>");
            XmlSerializer xml = new XmlSerializer(typeof(PessoaFisica));
            var pessoas = (PessoaFisica)xml.Deserialize(xmlContent);
        }
    }
    
    [XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/esusWebApi.Models")]
    public partial class PessoaFisica
    {
    
        public int Id { get; set; }
        public string Cpf { get; set; }
        public string Cns { get; set; }
        public string Nome { get; set; }
        public DateTime Nascimento { get; set; }
    }




    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br


    • Editado Bruno Brito quinta-feira, 19 de julho de 2018 18:36
    • Marcado como Resposta Milzerk sexta-feira, 20 de julho de 2018 11:07
    quinta-feira, 19 de julho de 2018 18:33
  • Olá. eu fiz da forma que você mostrou, e deu certo ^^. porém sou preciso a colocar o xml por texto estaticamente 

            var xmlContent = new StringReader("<PessoaFisica xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/esusWebApi.Models\">\r\n  <Cns>159357123456789</Cns>\r\n  <Cpf>04012802178</Cpf>\r\n  <Id>3089</Id>\r\n  <Nascimento>1993-05-08T12:00:00</Nascimento>\r\n  <Nome>TESTE TI</Nome>\r\n</PessoaFisica>");
    

    Olhei o que estava retornando no meu texto e vinha isso

    {"Id":3089,"Cpf":"04012802178","Cns":"159357123456789","Nome":"TESTE TI","Nascimento":"1993-05-08T12:00:00"}

    a falta do cabeçalho estava gerando o erro talvez? se sim. como posso  concertar?

    quinta-feira, 19 de julho de 2018 19:28
  • O erro era por que a classe PessoaFisica nao estava com o atributo XmlRoot.

    [XmlRoot(Namespace = "http://schemas.datacontract.org/2004/07/esusWebApi.Models")]

    O detalhe está no namespace. Ele é o mesmo do atributo {xmlns=} que sua aplicação recebe no XML.


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    • Marcado como Resposta Milzerk sexta-feira, 20 de julho de 2018 11:07
    quinta-feira, 19 de julho de 2018 22:51