2016-05-12 163 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

是模塊的根元素?和模塊下允許的多元通道元素? – Zee

+0

<資源名稱= 「變換」>文本 <資源名稱= 「列表」 refresh_interval = 「180」>文本 <資源名稱=「家「refresh_interval =」180「> text 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 –