使用RestSharp反序列化XML响应

10

我已经阅读了这个主题下提出的各种问题,但是仍然无法解决我的问题。

我正在尝试反序列化这个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和代码属性中的大小写不兼容。这可能是一个小问题,但你仍然应该修复它。 - Marcel
3个回答

5
我做了一些更改并使其工作:
问题可能有错别字,但我必须更改的是发布的XML无效:
<InvalidNo_2>01234567890</InvalidNo_1>

我了解您想使用.NET XMLSerializer,就像您使用XmlRoot和XmlElement注释一样,因此您必须覆盖默认的RestSharp序列化器,方法如下:

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

此外,我不得不删除RootElement设置,因为它与.NET序列化程序不兼容,因此删除了以下行:
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;
}

4

反序列化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类。

您可以使用Visual Studio内置功能将复制的JSON / XML格式负载粘贴到POCO类中。编辑-> Paste Special-> Paste JSON / XML as classes。


1
"编辑 -> 粘贴特殊内容 -> 将JSON/XML粘贴为类" 哇,我真希望十年前就知道这个!太棒了 :) - Radderz

-3

使用Restsharp,我通常采用不同的方法,但我主要在处理JSON。这是使用MVC Web API吗?

我将创建一个客户端,类型为IRestClient,在其中设置API网址和一些标头。然后我会使用以下代码:

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<>,但是这个链接应该会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接