2016-05-12 15 views
1

Ich versuche ein Objekt in XML zu deserialisieren, die tief verschachtelt ist.Deserialisierung von komplexen Objekt C#

Hier ist der XML-Code:

<modules> 
    <channel> 
     <resources> 
     <resource name="x" refresh_interval="180">... text ...</resource> 
     <resource name="y" refresh_interval="180">..text..</resource> 
     <resource name="z" refresh_interval="180">... text ...</resource> 
     </resources> 
    </channel> 
</modules> 

ich viel mehr Elemente wie Kanal in den Modulen Knoten, aber für das Beispiel dieses ist genug hoffe ich. Dann habe ich meine Klasse:

public class IdentifyData{ 

    public Modules modules; 
} 

public class Modules 
{ 
    public List<Resources> channels; 
} 

    public class Resources 
    { 
     [DataMember(Name = "name")] 
     public string name { get; set; } 

     [DataMember(Name ="url")] 
     public string url { get; set; } 

     [DataMember(Name = "refresh_interval")] 
     public string refresh_interval { get; set; } 
    } 

ich mit XmlArray und alles versucht, und es will einfach nicht arbeiten, und natürlich habe ich gesucht ganzen Stack-Überlauf, und ich konnte nicht die richtige Antwort finden.

+0

Ist Module Ihr Wurzelelement ? und mehrere Kanalelemente unter Modulen erlaubt? – Zee

+0

Text text text t Das ist, wie ich es von der API bekomme, und nicht nur 1 Kanal –

+0

Was ist Ihre Frage? –

Antwort

0

Wenn in einer Antwort nicht mehrere Module vorhanden sind und in einem Modul nicht mehrere Bilder oder Kanäle vorhanden sind, funktionieren die folgenden Klassen für Sie. Sie könnte diese Klassenstruktur mit einer Basisklasse vereinfachen, dass Bild und Kanal von erben, und ein paar andere Attribute:

[Serializable] 
[XmlRoot("response")] 
public class IdentifyData 
{ 
    [XmlElement("modules")] 
    public Modules modules { get; set; } 
} 

[Serializable] 
public class Modules 
{ 
    [XmlElement] 
    public Channel channel { get; set; } 
    [XmlElement] 
    public Image image { get; set; } 
} 
[Serializable] 
public class Image 
{ 
    [XmlArray("resources")] 
    [XmlArrayItem("resource")] 
    public List<Resources> resources { get; set; } 

} 

[Serializable] 
public class Channel 
{ 
    [XmlArray("resources")] 
    [XmlArrayItem("resource")] 
    public List<Resources> resources { get; set; } 
} 

[Serializable] 
public class Resources 
{ 
    [XmlAttribute] 
    public string name { get; set; } 

    [XmlAttribute] 
    public string url { get; set; } 

    [XmlAttribute] 
    public string refresh_interval { get; set; } 

    [XmlText] 
    public string someText { get; set; } 
} 

Dann es so deserialisieren:

using (var sr = new StreamReader("data.xml")) 
    { 
     var xs = new XmlSerializer(typeof(IdentifyData)); 
     var responseData = (IdentifyData)xs.Deserialize(sr); 
     Console.WriteLine("Got {0} channel resources", responseData.modules.channel.resources.Count); 
    } 
+0

Danke Freund, das ist die Lösung: D Vielen Dank: D –

Verwandte Themen