Usuário com melhor resposta
Deserializar arquivo xml de uma web api

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);
}
}
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
-
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
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 -
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
-
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
-
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?
-
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