繁体   English   中英

使用RestSharp进行XML属性反序列化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM