Десериализовать элементы массива в список - PullRequest
1 голос
/ 16 февраля 2012

У меня есть следующий 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 пустое.Почему это?

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

Давайте перейдем к проблеме. Warning является корневым элементом, поэтому его также необходимо преобразовать в класс:

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));
0 голосов
/ 16 февраля 2012

XmlSerializer просто разрешает один тип в массиве / списке.Это хорошо.Опубликовать мой тестовый код:

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