我经常看到这个问题,但似乎没有人的头衔确实能形容他们的问题。我从包含常规响应信息以及要反序列化的数据对象的Web API中获得了一个较大的响应对象。
我只想反序列化modelData元素。modelData对象类型是动态的,具体取决于API调用。
我在其他应用程序中反序列化xml,并创建了以下方法,但不知道如何专门仅获取modelData元素:
public static T ConvertXmltoClass<T>(HttpResponseMessage http, string elementName) where T : new()
{
var newClass = new T();
try
{
var doc = JsonConvert.DeserializeXmlNode(http.Content.ReadAsStringAsync().Result, "root");
XmlReader reader = new XmlNodeReader(doc);
reader.ReadToFollowing(elementName);
//The xml needs to show the proper object name
var xml = reader.ReadOuterXml().Replace(elementName, newClass.GetType().Name);
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
{
var serializer = new XmlSerializer(typeof(T));
newClass = (T)serializer.Deserialize(stream);
}
}
catch (Exception e)
{
AppLog.LogException(System.Reflection.MethodBase.GetCurrentMethod().Name, e);
}
return newClass;
}
我已多次更新此线程,以保持最新状态。我开始使用第一个解决方案进行更新。但是,该解决方案本身并不能解决问题。有了现在的代码,我没有异常,但没有将xml反序列化到我的对象中。相反,我得到了一个新的空白对象。有什么想法吗?
对象类型可以更改,这是我正在处理的当前对象:(请注意,我在Web API中反序列化了modelData中的确切xml)
namespace WebApiCommon.DataObjects
{
[Serializable]
public class ReportXDto
{
public ReportXDto()
{
Parameters = new List<ReportParameterXDto>();
}
public int Id { get; set; }
public string ReportTitle { get; set; }
public bool HasParameters { get; set; } = false;
public List<ReportParameterXDto> Parameters { get; set; }
public string SourceSql { get; set; }
public DataTable Report { get; set; }
}
相关分类