2016-04-27 34 views
0

次のXMLがあります。逆シリアル化しようとしています。私は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); 

答えて

0

はありません、RestSharpは、XMLでの自動閉鎖要素を持つ任意の問題を持っていません。

DeserializeAsを使用することにより推測できるよう、あなたが彼らのデフォルトのXMLデシリアライザ(RestSharp.Deserializers.XmlDeserializer)、 を使用しているようにあなたは、彼らが内部システムからのXMLパーサーを使用 library's source codeで見ることができ、属性。 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でまだ1)では動作しません。

version of the class committed at the GitHub repositoryを使用する必要があります。クラスのコードを取得し、トップ名前空間ステートメントを独自のものに変更し、ディスクに保存してプロジェクトに追加します。次に、RestSharpクライアントを新しい(より良い)バージョンのデシリアライザを使用するように設定します。

_restClient.AddHandler("application/xml",new XmlDeserializer()); 
関連する問題