2016-04-27 8 views
0

Ich habe die folgende XML und ich versuche es zu deserialisieren. Ich habe die RestSharp-Bibliothek verwendet, aber mit dieser speziellen Antwort erhalte ich eine leere Liste von Ressourcen. Weißt du, ob die Bibliothek Probleme mit selbstschließenden Elementen in XML hat?XML-Attribute Deserialisierung mit RestSharp

<?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# Klassen:

[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; } 
} 

Letzte meinem Ruf:

var response = _restClient.Execute<ResourceList>(request); 

Antwort

0

Nein, RestSharp hat keine Probleme mit selbstschließenden Elemente in XML.

Wie Sie ihren Standard-XML-Deserializer (RestSharp.Deserializers.XmlDeserializer) verwenden, wie durch die Verwendung der DeserializeAs abgeleitet wird Attribut, Sie in den library's source code, dass sie intern den XML-Parser aus dem System verwenden sehen. Xml.

So sollte Ihr XML-Beispiel ohne Probleme deserialisiert werden. Aber dass ich empfehlen, eine einfachere und schnellere Lösung:

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); 

Diese Lösung ist jedoch nicht mit dem aktuellen v105.2.3 funktioniert (der immer noch auf NuGet).

Sie müssen die version of the class committed at the GitHub repository verwenden. Holen Sie sich einfach den Code für die Klasse, ändern Sie die oberste Namespace-Anweisung in Ihre eigene, speichern Sie sie auf der Festplatte und fügen Sie sie Ihrem Projekt hinzu. Stellen Sie dann einfach den RestSharp-Client so ein, dass er die neue (bessere) Version des Deserialisers verwendet:

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