2012-02-16 203 views
1

我有以下XML ...反序列化數組元素列出

<configuration> 
    <img name="name1" /> 
    <img name="name2" /> 
    <warn> 
     <img name="warn1" /> 
    </warn> 
</configuration> 

...我嘗試反序列化到...

[XmlType("img")] 
public class ImageNameExceptionItemXml 
{ 
    [XmlAttribute("name")] 
    public string Filename; 
} 

[XmlRoot("configuration")] 
public class ImageNameExceptionListXml: List<ImageNameExceptionItemXml> 
{ 
    [XmlArray("warn")] 
    [XmlArrayItem("img")] 
    public ImageNameExceptionListXml WarnList { get; set; } 
} 

...但我結束了WarnList屬性爲null。

我已經嘗試過...

[XmlElement("warn"}] 
public ImageNameExceptionListXml WarnList { get; set; } 

......或者......

[XmlElement("warn"}] 
public List<ImageNameExceptionItemXml> WarnList { get; set; } 

...但我還是最終與WarnList財產空。這是爲什麼?

+0

架構看起來並不好。是否有可能改變? – findcaiyzh 2012-02-16 11:43:14

+0

不確定,但我不認爲序列化器喜歡反序列化它認爲是數組的額外屬性。所以這可能會很棘手,如果沒有明確地實現IXmlSerializable。 – Balthy 2012-02-16 11:51:03

+0

@findcaiyzh我只能更改''節點。也許我可以嘗試 <結構> sjlewis 2012-02-16 11:55:09

回答

4

讓我們來看看這個問題。該警告是 「根」 元素,所以,你必須在一個類來改造它太:

的XML:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <img name="name1" /> 
    <img name="name2" /> 
    <warn> 
     <img name="warn1" /> 
     <img name="warn2" /> 
    </warn> 
</configuration> 

類:

[XmlType("img")] 
public class ImageNameExceptionItemXml 
{ 
    [XmlAttribute("name")]  
    public string Filename; 
} 

[XmlType("warn")] 
public class WarnExceptionItemXml 
{ 
    [XmlElement("img")] 
    public List<ImageNameExceptionItemXml> ImgList { get; set; } 
} 

[XmlRoot("configuration")] 
public class ImageNameExceptionListXml 
{ 
    [XmlElement("img")] 
    public List<ImageNameExceptionItemXml> ImgList { get; set; } 

    [XmlElement("warn")] 
    public WarnExceptionItemXml WarnList { get; set; } 
} 

而反序列化測試:

XmlSerializer xml = new XmlSerializer(typeof(ImageNameExceptionListXml)); 

ImageNameExceptionListXml teste = (ImageNameExceptionListXml)xml.Deserialize(new FileStream("XMLFile1.xml", FileMode.Open)); 
+2

在vs2010中測試過,效果比我的答案好。 – findcaiyzh 2012-02-16 12:07:21

+0

謝謝,夥計們。這個伎倆。 – sjlewis 2012-02-16 12:25:34

+0

你是否必須在'[XmlElement]'和'[XmlType]'中重複同名? – svick 2012-02-16 12:26:16

0

XmlSerializer只允許array/list中的一種類型。很好。發佈我的測試代碼:

[XmlType("img")] 
[Serializable] 
public class ImageNameExceptionItemXml 
{ 
    [XmlAttribute("name")] 
    public string Filename; 
} 

[XmlType("warn")] 
[Serializable] 
public class Warnning 
{ 
    [XmlArrayItem(typeof(ImageNameExceptionItemXml))] 
    public List<ImageNameExceptionItemXml> imgs { get; set; } 
} 

[XmlRoot("configuration")] 
[Serializable] 
public class ImageNameExceptionListXml 
{ 
    [XmlArrayItem(typeof(Warnning))] 
    public List<Warnning> warns{ get; set; } 

    [XmlArrayItem(typeof(ImageNameExceptionItemXml))] 
    public List<ImageNameExceptionItemXml> imgs { get; set; } 

} 

XML:

<configuration> 
<imgs> 
    <img name="name1" /> 
    <img name="name2" /> 
</imgs> 
<warns> 
    <warn> 
     <imgs> 
     <img name="warn2" /> 
     <img name="warn1" /> 
     </imgs> 
    </warn> 
    <warn> 
     <imgs> 
     <img name="warn3" /> 
     <img name="warn4" /> 
     </imgs> 
    </warn> 
</warns> 
</configuration> 
+0

Vinicius Ottoni的回答比較好。 – findcaiyzh 2012-02-16 12:08:07