2016-05-12 2 views
1

Я пытаюсь десериализовать объект в xml, который глубоко вложен.десериализация сложного объекта C#

Вот код XML:

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

У меня есть намного больше элементов, таких как канал в узле модулей, но для примера это один достаточно, я надеюсь. Тогда у меня есть класс:

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

Я попытался с XmlArray и все, и он просто не хочет работать, и, конечно, я искал повсюду переполнение стека, и я не мог найти правильный ответ.

+0

Является ли модули корневого элемента ? и элемент mutliple channel, разрешенный по модулю? – Zee

+0

<имя ресурса = "преобразование"> текст <имя ресурса = "список" refresh_interval = "180"> текст имя <ресурс = "домой "refresh_interval =" 180 "> текст <имя ресурса =" все "> t Вот как я получаю это от api, и не только 1 канал –

+0

В чем вопрос? –

ответ

0

Если в модуле нет нескольких модулей, и в модуле нет нескольких изображений или каналов, то для вас будут работать следующие классы. Вы могли бы еще больше упростить структуру классов с базовым классом, изображения и канал унаследуют от и несколько других атрибутов:

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

Тогда десериализации это так:

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

Спасибо, друг, это решение: D Большое спасибо: D –

Смежные вопросы