【问题标题】:XML attributes deserialization with RestSharp使用 RestSharp 反序列化 XML 属性
【发布时间】:2016-04-27 15:32:20
【问题描述】:

我有以下 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);

【问题讨论】:

    标签: c# restsharp xml-deserialization


    【解决方案1】:

    不,RestSharp 对 XML 中的自闭合元素没有任何问题。

    当您使用他们的默认 XML 反序列化器 (RestSharp.Deserializers.XmlDeserializer), 可以通过使用 DeserializeAs 属性推断,您可以在 library's source code 他们在内部使用来自 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 上的那个)。

    您必须使用version of the class committed at the GitHub repository。只需获取该类的代码,将顶部命名空间语句更改为您自己的,保存到磁盘并将其添加到您的项目中。然后,只需将 RestSharp 客户端设置为使用新的(更好的)反序列化器版本:

    _restClient.AddHandler("application/xml",new XmlDeserializer());
    

    【讨论】:

    • 最后这个答案帮助了我。有趣的是,RestSharp 网页本身并不容易解释反序列化......
    猜你喜欢
    • 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
    相关资源
    最近更新 更多