XMLSerializer Десериализация двух элементов в один список

196
21 апреля 2018, 17:06

Можно ли как-то произвести десериализацию разных по названию элементов, но одинакового содержимого в один список?

XML

<template>
<images>
<small>
</small>
<large>
</large>
<small>
</small>
<large>
</large>
</images>
</template>

CODE

public class myclass
{
[XmlElement("small")]
[XmlElement("large")]
ObservableCollection<MyImage> myimage
{get;set;}
}

При таком определении, он ругается, что необходимо указать XmlChoiceIdentifierAttribute Хотя как мне кажется, он тут не причем...

Писать свой десериализатор очень не хочется.

PS: Или, конечно, как вариант, можно попробовать сделать два разных списка, а потом в ListView из привязать мультибиндингом? Как правильнее подойти к этому вопросу?

Answer 1

Я сгенерировал набор классов по представленному XML с помощью Студии: Edit > Paste Special > Paste XML As Classes. Обработал их напильником, убрав все лишние атрибуты и поля.

Также я предположил, что элементы должны содержать в себе вложенные свойства. Примерно так:

<template>
  <images>
    <small>
      <size>100</size>
    </small>
    <large>
      <size>1000</size>
    </large>
    <small>
      <size>110</size>
    </small>
    <large>
      <size>1100</size>
    </large>
  </images>
</template>

В итоге у меня получился такой набор классов:

[XmlRoot("template")]
public class Template
{
    [XmlElement("images")]
    public TemplateImages Images { get; set; }
}
public class TemplateImages
{
    [XmlElement("large", typeof(Image))]
    [XmlElement("small", typeof(Image))]
    [XmlChoiceIdentifier("ItemsElementName")]
    public Image[] Items { get; set; }
    //[XmlElement("ItemsElementName")]
    //[XmlIgnore()]
    public ItemsChoiceType[] ItemsElementName { get; set; }
}
public enum ItemsChoiceType
{
    large,
    small,
}
public class Image
{
    [XmlElement("size")]
    public int Size { get; set; }
}

Вроде работает и без закомментированных атрибутов.

using (var fs = new FileStream("test.xml", FileMode.Open))
{
    var xs = new XmlSerializer(typeof(Template));
    var template = (Template)xs.Deserialize(fs);
    foreach (var item in template.Images.Items)
        Console.WriteLine(item.Size);
    foreach (var name in template.Images.ItemsElementName)
        Console.WriteLine(name);
}
READ ALSO
Проблема с преобразование string в datetime

Проблема с преобразование string в datetime

Возникла проблема при преобразовании переменной string в datetime

208
Не срабатывает событие MimeKit

Не срабатывает событие MimeKit

Подскажите пожалуйста, почему может не срабатывать событиеВот мой код

212
Entity Framework создаёт лишнюю таблицу

Entity Framework создаёт лишнюю таблицу

К примеру, имеется у меня контекст из двух сетов:

195
Xamarin ListView как обновить отображение?

Xamarin ListView как обновить отображение?

Через кнопки пытаюсь взаимодействовать со списком, добавлять/удалять элементы, изменять размер строк(ячеек) через SliderНо всё это не отображается,...

338