使用 RestSharp 反序列化 XML 响应
Deserializing XML Response using RestSharp
我已经阅读了这里已经提出的关于这个主题的各种问题,但我仍然离解决我的问题还差得很远。
我正在尝试反序列化此 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
使用 Restsharp 我通常采用不同的方法,但我主要使用 JSON。这是使用 MVC web api?
我会创建一个 IRestClient
类型的客户端,我会在其中设置 API url 和一些 headers。然后我会使用,
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<>
,但这个 link 应该可以帮助
我做了一些修改,可以让它工作:
可能是问题中的错字,但我必须更改的是发布的 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 在 class 中是整数,但返回值不是 (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;
}
反序列化的简单代码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 class。
You can paste the copied payload in JSON/XML format into POCO class by
using Visual Studios in built feature. Edit -> Paste Special -> Paste
JSON/XML as classes
我已经阅读了这里已经提出的关于这个主题的各种问题,但我仍然离解决我的问题还差得很远。
我正在尝试反序列化此 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
使用 Restsharp 我通常采用不同的方法,但我主要使用 JSON。这是使用 MVC web api?
我会创建一个 IRestClient
类型的客户端,我会在其中设置 API url 和一些 headers。然后我会使用,
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<>
,但这个 link 应该可以帮助
我做了一些修改,可以让它工作:
可能是问题中的错字,但我必须更改的是发布的 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 在 class 中是整数,但返回值不是 (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;
}
反序列化的简单代码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 class。
You can paste the copied payload in JSON/XML format into POCO class by using Visual Studios in built feature. Edit -> Paste Special -> Paste JSON/XML as classes