反序列化数组元素列出

问题描述:

我有以下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

让我们来看看这个问题。该警告是 “根” 元素,所以,你必须在一个类来改造它太:

的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

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