反序列化数组元素列出
我有以下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财产空。这是为什么?
让我们来看看这个问题。该警告是 “根” 元素,所以,你必须在一个类来改造它太:
的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));
在vs2010中测试过,效果比我的答案好。 – findcaiyzh 2012-02-16 12:07:21
谢谢,伙计们。这个伎俩。 – sjlewis 2012-02-16 12:25:34
你是否必须在'[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>
Vinicius Ottoni的回答比较好。 – findcaiyzh 2012-02-16 12:08:07
架构看起来并不好。是否有可能改变? – findcaiyzh 2012-02-16 11:43:14
不确定,但我不认为序列化器喜欢反序列化它认为是数组的额外属性。所以这可能会很棘手,如果没有明确地实现IXmlSerializable。 – Balthy 2012-02-16 11:51:03
@findcaiyzh我只能更改''节点。也许我可以尝试 配置> –
sjlewis
2012-02-16 11:55:09