[英]XML attributes deserialization with RestSharp
我有以下xml,并且正在尝试反序列化。 我已经使用过RestSharp库,但是通过这个特定的响应,我得到了一个空的资源列表。 您知道该库是否存在XML自关闭元素的问题?
<?xml version="1.0" encoding="utf-8"?>
<resourceList xmlns="..." xmlns:xsi="..." xsi:schemaLocation="..." location="...">
<resourceURL location="../../../campaign/12" metaData1="12" metaData2="ACD Systems" metaData3="CPS" metaData4="Active" metaData5="Public" metaData6="No" metaData7="2005-10-28" metaData8="2020-12-31"/>
<resourceURL location="../../../campaign/10607" metaData1="10607" metaData2="Aiseesoft" metaData3="CPS" metaData4="Active" metaData5="Public" metaData6="No" metaData7="2013-07-17" metaData8="2033-12-31"/>
<resourceURL location="../../../campaign/567" metaData1="567" metaData2="AnchorFree Hotspot Shield Elite" metaData3="CPS" metaData4="Active" metaData5="Select" metaData6="No" metaData7="2011-10-03" metaData8="2031-12-31"/>
<resourceURL location="../../../campaign/384" metaData1="384" metaData2="Avast" metaData3="CPS" metaData4="Active" metaData5="Select" metaData6="No" metaData7="2008-06-30" metaData8="2025-01-31"/>
</resourceList>
C#类:
[DeserializeAs(Name = "resourceList")]
public class ResourceList
{
[DeserializeAs(Name = "resourceURL")]
public List<ResourceUrl> ResourceURL { get; set; }
}
public class ResourceUrl
{
public string Location { get; set; }
public string MetaData1 { get; set; }
public string MetaData2 { get; set; }
}
最后我的电话:
var response = _restClient.Execute<ResourceList>(request);
不,RestSharp在XML中的自动关闭元素上没有任何问题。
当您使用其默认的XML反序列化程序(RestSharp.Deserializers.XmlDeserializer)时(可以通过使用DeserializeAs属性来推断),您可以在库的源代码中看到它们在内部使用System.Xml的XML解析器。
因此,应该对XML示例进行反序列化而不会出现问题。 但是为此,我建议一个更简单,更快速的解决方案:
using System.Collections.Generic;
using RestSharp.Deserializers;
public class ResourceList : List<ResourceUrl> {}
[DeserializeAs(Name = "resourceURL")]
public class ResourceUrl {
[DeserializeAs(Name = "location")]
public string Location { get; set; }
[DeserializeAs(Name = "metaData1")]
public string MetaData1 { get; set; }
[DeserializeAs(Name = "metaData2")]
public string MetaData2 { get; set; }
}
//(...)
request.RootElement = null;
request.XmlNamespace = null;
var response = _restClient.Execute<ResourceList>(request);
但是,该解决方案不适用于当前的v105.2.3(仍在NuGet上)。
您必须使用在GitHub存储库中提交的类的版本 。 只需获取该类的代码,将顶部的名称空间语句更改为您自己的名称,然后将其保存到磁盘上并将其添加到您的项目中即可。 然后,只需将RestSharp客户端设置为使用反序列化器的新版本(更好):
_restClient.AddHandler("application/xml",new XmlDeserializer());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.