Deserializar respuesta en xml

Rodrigo Menares 20 Puntos de reputación
2024-04-04T03:37:50.48+00:00
using HttpResponseMessage responseuf = await client.GetAsync("https://www.mindicador.cl/api/uf/" + Fecha);
//aqui hace la lectura de la UF
 string StrResultTestUf = await responseuf.Content.ReadAsStringAsync();
 //genera Log de Resultados
 _logger.LogInformation($"Lectura de Uf Correcta {StrResultTestUf}");                  
 if (responseuf.Content.Headers.ContentType.MediaType == "application/json")  {
   var IndicadoresUf = JsonConvert.DeserializeObject<IndicadoresEconomicos>(StrResultTestUf);
   if (fecuf != null) {
     fecuf = Convert.ToDateTime(IndicadoresUf.serie[0].fecha.ToString());
     vlouf = Convert.ToDecimal(IndicadoresUf.serie[0].valor.ToString());     }
  else {
     _logger.LogError($"{StrResultTestUf}");     }
       }
que me permite leer desde un sitio web la uf y lo hace super.pero tengo el siguiente problema, quiero hacer lo mismo, pero con formato xnl, es decir: 
if (responseuf.Content.Headers.ContentType.MediaType == "text/xml") {
     TablaUf result; 
    XmlSerializer serializer = new XmlSerializer(typeof(TablaUf));
     using (StringReader reader = new StringReader(StrResultTestUf)){
     result = (TablaUf)serializer.Deserialize(reader); 
     fecuf = Convert.ToDateTime(result.FechUf);
     vlouf = Convert.ToDecimal(result.ValUf);
 }

quiero saber si estoy bien o sino, como y que debo corregir,para que si el api me responde con formato XML, pueda rescatar los valores devueltos y pode pasarlos a una BBDD.
Gracias
ASP.NET
ASP.NET
Conjunto de tecnologías de .NET Framework para la creación de aplicaciones y servicios web XML.
47 preguntas
0 comentarios No hay comentarios
{count} votos

Respuesta aceptada
  1. Gao Chen 5,690 Puntos de reputación Proveedor de Microsoft
    2025-01-23T15:59:34.2+00:00

    Hola Rodrigo Menares,

    ¡Bienvenido(a) a Microsoft Q&A!

    Lamentamos sinceramente la demora en abordar tu tema en este foro. Por favor ten en cuenta que nosotros no soportamos código ni scripts sin embargo, tu código actual para deserializar JSON parece estar bien estructurado. Ahora, para deserializar XML, tu enfoque es correcto, pero vamos a asegurarnos de que todos los detalles estén en su lugar.

    Aquí tienes una versión revisada y completa de tu código para manejar tanto JSON como XML:

    using System;
    using System.IO;
    using System.Net.Http;
    using System.Threading.Tasks;
    using System.Xml.Serialization;
    using Newtonsoft.Json;
    
    public class IndicadoresEconomicos
    {
        public Serie[] serie { get; set; }
    }
    
    public class Serie
    {
        public DateTime fecha { get; set; }
        public decimal valor { get; set; }
    }
    
    public class TablaUf
    {
        public string FechUf { get; set; }
        public string ValUf { get; set; }
    }
    
    public async Task ObtenerUf(string Fecha)
    {
        using HttpClient client = new HttpClient();
        HttpResponseMessage responseuf = await client.GetAsync("https://www.mindicador.cl/api/uf/" + Fecha);
        string StrResultTestUf = await responseuf.Content.ReadAsStringAsync();
        _logger.LogInformation($"Lectura de Uf Correcta {StrResultTestUf}");
    
        if (responseuf.Content.Headers.ContentType.MediaType == "application/json")
        {
            var IndicadoresUf = JsonConvert.DeserializeObject<IndicadoresEconomicos>(StrResultTestUf);
            if (IndicadoresUf != null && IndicadoresUf.serie.Length > 0)
            {
                fecuf = IndicadoresUf.serie[0].fecha;
                vlouf = IndicadoresUf.serie[0].valor;
            }
            else
            {
                _logger.LogError($"{StrResultTestUf}");
            }
        }
        else if (responseuf.Content.Headers.ContentType.MediaType == "text/xml")
        {
            TablaUf result;
            XmlSerializer serializer = new XmlSerializer(typeof(TablaUf));
            using (StringReader reader = new StringReader(StrResultTestUf))
            {
                result = (TablaUf)serializer.Deserialize(reader);
            }
            if (result != null)
            {
                fecuf = Convert.ToDateTime(result.FechUf);
                vlouf = Convert.ToDecimal(result.ValUf);
            }
            else
            {
                _logger.LogError($"{StrResultTestUf}");
            }
        }
        else
        {
            _logger.LogError($"Formato de respuesta no soportado: {responseuf.Content.Headers.ContentType.MediaType}");
        }
    }
    

    Puntos clave:

    • Verificación del tipo de contenido: Asegúrate de que el MediaType sea exactamente "text/xml" para XML y "application/json" para JSON.
    • Deserialización XML: Usa XmlSerializer para deserializar la respuesta XML.
    • Manejo de errores: Añade verificaciones para asegurarte de que los objetos deserializados no sean nulos antes de intentar acceder a sus propiedades.

    Con estos ajustes, deberías poder manejar respuestas en formato XML y JSON correctamente. Espero que la información te haya sido de utilidad. Adicionalmente, si no recibimos una respuesta tuya en los próximos días, procederemos a cerrar el tema. Agradecemos tu comprensión y estamos aquí para ayudar en lo que sea necesario.

    Atentamente,

    Gao


    Si esta respuesta resolvió tu consulta, por favor haz clic en 'Aceptar respuesta'. Esto nos ayuda a mejorar continuamente la calidad y relevancia de nuestras soluciones.

    1 persona ha encontrado útil esta respuesta.

1 respuesta adicional

Ordenar por: Muy útil
  1. Rodrigo Menares 20 Puntos de reputación
    2025-01-24T16:02:09.1833333+00:00

    gracias por la respuesta, me sirvió al 100% y soluciono la situación, pero es una pena que hayan cerrado el sitio de msdn, donde yo podía hacer estas y otras consultas y las respuestas no demoraban tanto.

    0 comentarios No hay comentarios

Su respuesta

Las respuestas se pueden marcar como respuestas aceptadas por el autor de la pregunta, lo que ayuda a los usuarios a conocer la respuesta que resolvió el problema del autor.