【问题标题】:Deserializing XML Response using RestSharp使用 RestSharp 反序列化 XML 响应
【发布时间】:2016-02-24 09:57:51
【问题描述】:

我已经阅读了这里已经提出的关于这个主题的各种问题,但我仍然没有接近解决我的问题。

我正在尝试反序列化此 xml 响应:

 <?xml version="1.0" encoding="ISO-8859-1" ?>
   <SubmissionResult>
     <Result>ACCEPTED</Result>
       <SubmissionID>
         <RefNo>77587-1425386500</RefNo>
         <Submitted>9</Submitted>
         <ValidNo>7</ValidNo>
         <InvalidNo>2</InvalidNo>
         <InvalidNo_1>08452782055</InvalidNo_1>
         <InvalidNo_2>01234567890</InvalidNo_1>
         <TextvID>77587-1425386500</TextvID>
       </SubmissionID>
     <Credits>999999</Credits>
   </SubmissionResult> 

使用这些类:

[XmlRoot ("SubmissionResult")]
public class SubmissionResult
{
    [XmlElement ("Result")]
    public string Result { get; set; }
    public SubmissionID SubmissionID { get; set; }
    [XmlElement("Credits")]
    public int Credits { get; set; }
}

public class SubmissionID
{
    [XmlElement("RefNo")]    
    public int RefNo { get; set; }
    [XmlElement("Submitted")]    
    public int Submitted { get; set; }
    [XmlElement("ValidNo")]    
    public int ValidNo { get; set; }
    [XmlElement("TextVID")]    
    public string TextVID { get; set; }
}

但是我只返回 null 和 0 值,我认为这是默认值。

这是获取结果并希望反序列化的代码:

try
{
    var request = new RestRequest();
    request.RequestFormat = DataFormat.Xml;
    request.Resource = APIURL;
    request.RootElement = "SubmissionResult";

    SubmissionResult r = Execute<SubmissionResult>(request);
}

public static T Execute<T>(RestRequest request) where T : new()
{
     var client = new RestClient();
         client.BaseUrl = new  Uri("https://www.textvertising.co.uk/_admin/api", UriKind.Absolute);

     var response = client.Execute<T>(request);

     return response.Data;
}

非常感谢您提供的任何帮助。

CS

【问题讨论】:

  • TextvID 在 XML 和 code 属性中的大小写不兼容。轻微且可能不相关,但您仍应解决此问题。

标签: c# xml api restsharp


【解决方案1】:

我做了一些更改,并且可以使它工作:

可能是问题中的错字,但我必须更改的是发布的 XML 无效:

<InvalidNo_2>01234567890</InvalidNo_1>

我知道你想使用 .NET XMLSerializer,就像你使用 XmlRoot 和 XmlElement 注释一样,所以你必须像这样覆盖 RestSharp 附带的默认注释:

request.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer();

我还必须删除不能很好地与 .NET 序列化程序配合使用的 RootElement 设置,因此删除了以下行:

request.RootElement = "SubmissionResult";   

所以我的版本变成了:

var request = new RestRequest();
request.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer();
request.RequestFormat = DataFormat.Xml;
// request.Resource = APIURL;

SubmissionResult r = Execute<SubmissionResult>(request);

最后我注意到 RefNo 在类中是整数,但返回的值不是 (77587-1425386500) 所以我把它变成了一个字符串:

[XmlElement("RefNo")]
public string RefNo { get; set; }

我在 mocky.io 上创建了一个模拟响应并对其进行了测试,它似乎工作正常:

public static T Execute<T>(RestRequest request) where T : new()
{
    var client = new RestClient();
    client.BaseUrl = new Uri("http://www.mocky.io/v2/56cd88660f00009800d61ff8", UriKind.Absolute);

    var response = client.Execute<T>(request);

    return response.Data;
}

【讨论】:

    【解决方案2】:

    反序列化 xml 响应的简单代码

    //Create object of RestClient
    IRestClient restClient = new RestClient();
    
    //Create request with return type of payload as xml and method as GET
    IRestRequest restRequest = new RestRequest(Url);
    restRequest.AddHeader("Accept", "application/xml");
    restRequest.Method = Method.GET;
    
    //Execute the request to fetch the response
    IRestResponse restResponse = restClient.Execute(restRequest);
    
    //This is wrapper for System.Xml.Serialization.XmlSerializer 
    var dotNetXmlDeserializer = new RestSharp.Deserializers.DotNetXmlDeserializer();
    ModelClassName modelClassObject =
     dotNetXmlDeserializer.Deserialize<ModelClassName>(restResponse);
    
     Console.WriteLine(ModelClassName.PropertyName);
    
           
    

    其中 ModelClassName 是我们创建的 POCO 类,用于以反序列化的形式存储响应。

    您可以通过以下方式将复制的 JSON/XML 格式的有效负载粘贴到 POCO 类中 在内置功能中使用 Visual Studios。编辑 -> 选择性粘贴 -> 粘贴 JSON/XML 作为类

    【讨论】:

      【解决方案3】:

      使用 Restsharp 我通常会采用不同的方法,但我主要使用 JSON。这是使用 MVC web api 吗?

      我将创建一个类型为 IRestClient 的客户端,我将在其中设置 API url 和一些标头。然后我会使用,

      var response = client.Post<T>(DataFormat.Json, "admin/api", content); 
      if(response.Data != null)
      //populate T object with data
      

      如果您可以提供有关您正在调用的 Web 服务方法的更多信息.. 这会有所帮助,谢谢 :) 祝您好运..

      看看这个 http://restsharp.org/ 老实说,我自己从未使用过RestClient.Execute&lt;&gt;,但希望此链接对您有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多